読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

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

ぷらぷらー

前回の記事だと一番左側に数値がこれない事に気付いたのでちょっと改良したなどです。組み込み型ならいけるはずです。

#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 T, typename Pred = void>
struct value_wrap {
  typedef typename T::value_type type;
};

template <typename T>
struct value_wrap<T, typename std::enable_if<std::is_scalar<T>::value>::type> {
  typedef T type;
};

template <typename Lhs, typename Op, typename Rhs>
struct reactive_expression {
  typedef typename value_wrap<Lhs>::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 = 2 * reactive<int>(a) * 3;
  a = 2;
  std::cout << b << std::endl;
  return 0;
}

条件分岐を甘えたので万全ではありませんが、まぁ所詮はネタ記事なのでということで流しておきます。