ゆとりーなの日記

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

リアクティブプログラミングC++?

リアクティブプログラミングというパラダイムがあるようです。詳しくはなぜリアクティブプログラミングは重要か。 - Conceptual Contextureを見てもらう事にして、取り敢えず雰囲気次のような事が起きるパラダイムらしいです。

a = 1;
b = a * 3;
a = 2;

これでbを出力すると、普通に行けば3が出力されそうなものですが、リアクティブプログラミングだと6が出力されるみたいです。式を保存してると考えればいいんですかね。bはとにかくaの3倍なんだよってことみたいですよ。
取り敢えずC++で適当に実装。

#include <iostream>
#include <type_traits>

template <typename T>
class reactive {
 public:
  typedef T value_type;

  explicit reactive(const T &val) : val_(val) {}

  operator T() const {
    return val_;
  }

 private:
  const T &val_;
};

struct reactive_mul {
  template <typename Lhs, typename Rhs>
  static Lhs eval(const Lhs &lhs, const Rhs &rhs) {
    return lhs * rhs;
  }
};

template <typename Lhs, typename Op, typename Rhs>
struct reactive_expression {
  typedef typename Lhs::value_type value_type; 

  reactive_expression(const Lhs &lhs, const Rhs &rhs) : lhs_(lhs), rhs_(rhs) {}

  operator value_type() const {
    return Op::eval(value_type(lhs_), value_type(rhs_));
  }

 private:
  const Lhs &lhs_;
  const Rhs &rhs_;
};

template <typename Lhs, typename Rhs> 
reactive_expression<Lhs, reactive_mul, Rhs> operator *(const Lhs &lhs, const Rhs &rhs) {
  return reactive_expression<Lhs, reactive_mul, Rhs>(lhs, rhs);
}

int main() {
  int a = 1;
  auto b = reactive<int>(a) * 3;
  a = 2;
  std::cout << b << std::endl;
  return 0;
}

出力

6

ほんと適当です。ただやりたかっただけです。構文も微妙ですし。
いずれBoost先生が何とかしてくれるはずです。