ゆとりーなの日記

日記的な事を書いて行くと思はれる

C++でHSPっぽく表記

取り敢えずこんな感じのが出来ました。

#include <iostream>
#include <string>
#include <vector>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/range/irange.hpp>

const struct mes_t {
  template <typename T>
  void operator ()(const T &text) const {
    std::cout << text << std::endl;
  }
} mes_ = {};

const struct color_t {
  void operator ()(const std::vector<int> &color) const {
    std::cout << "赤:" << color[0] << std::endl;
    std::cout << "緑:" << color[1] << std::endl;
    std::cout << "青:" << color[2] << std::endl;
  }
} color_ = {};

struct dim_ {
  dim_() {}

  dim_(const int size) : v_(size) {}

  int &operator ()(const int index) {
    return v_[index];
  }

 private:
  std::vector<int> v_;
};

template <typename T>
void operator |(const mes_t &mes, const T &text) {
  mes(text);
}

std::vector<int> operator | (const color_t &color, const int r) {
  std::vector<int> v;
  v.push_back(r);
  return v;
}

std::vector<int> operator ,(std::vector<int> color, const int r) {
  color.push_back(r);
  if (color.size() == 3) {
    color_(color);
  }
  return color;
}

void operator ,(dim_ &d, const int e) {
  d = dim_(e);
}

template <typename F>
void repeat_loop(const int i, const F f) {
  boost::for_each(boost::irange(0, i), f);
}

#define mes mes_ |
#define color color_ |
#define dim dim_ a;
#define repeat repeat_loop(
#define do , [](const int cnt) {
#define loop });

int main() {
  mes "HSP風表記";
  color 0, 128, 256;
  dim a, 5;
  a(1) = 64;
  mes a(1);
  repeat 10 do
    mes cnt;
  loop;
}

出力

HSP風表記
赤:0
緑:128
青:256
64
0
1
2
3
4
5
6
7
8
9

取り敢えず現状の目立った問題点は、デフォルト引数の実装方法が思いつかないことこ、配列変数名がこれだと予め指定したものしか使えないってとこですかね。
行末のセミコロン、repeatのあとのdoなしはちょっと無理っぽいので諦めました。doはLuaから雰囲気を借りてきました。予約語を#defineで上書きはまずかったような気はしますが、VC++では何も言わずに通してくれるのでまぁいいということにしておきます。
可変長引数は,よりも優先順位が低い演算子があればあるいはって感じなんですがそんなものはないのでちょっと詰んだ感じがします。あと配列に関しては変数の宣言部に使う,はオーバーロード出来る気配がちょっとないのでこれもちょっと詰んだ感じです。
なんかもっと上手い方法があるのかもしれませんが今回はこの辺でということで。