我想通過使用模板參數來指定do_eval
變換的返回類型(到目前爲止double
)基於Boost Proto「Unpacking Expressions」示例從here開始構建。模板化簡單Boost Proto C++表達式計算器
爲了簡便起見,我將介紹一個工作,簡化(加只)版本的do_eval
:
struct do_eval2 : proto::callable
{
typedef double result_type;
template <typename X, typename Y>
result_type operator()(proto::tag::plus, X x, Y y) const { return x + y; }
};
我再增加一個模板參數T
而不是double
:
template <typename T>
struct do_eval2 : proto::callable
{
typedef T result_type;
template <typename X, typename Y>
result_type operator()(proto::tag::plus, X x, Y y) const { return x + y; }
};
和修改相關的eval
結構爲:
struct eval2
: proto::or_<
proto::when<proto::terminal<proto::_>, proto::_value>
, proto::otherwise<do_eval2<double>(proto::tag_of<proto::_>(),
eval2(proto::pack(proto::_))...)>
>
{};
但是當我使用它時,如下面的代碼所示,我得到錯誤,從錯誤開始:無法綁定'std :: ostream {aka std :: basic_ostream}'左值爲'std :: basic_ostream & &'我能滿足編譯器嗎?
int main(int argc, char *argv[])
{
int one = 1, two = 2;
cout << eval2()(phoenix::ref(one)+phoenix::ref(two)) << '\n';
return 0;
}
+1爲答案,很高興看到更多的Boost作者在這個網站上活躍起來! – TemplateRex 2013-05-01 19:10:22
3答案:你們都寵壞了我:) – user2023370 2013-05-01 19:44:40