【发布时间】:2013-04-30 15:34:58
【问题描述】:
我想在 here 的 Boost Proto“解包表达式”示例的基础上进行构建,方法是使用模板参数指定 do_eval 转换的返回类型(迄今为 double)。
为简洁起见,我将展示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::_))...)>
>
{};
但是当我使用它时,如下面的代码所示,我得到错误以 error: cannot bind 'std::ostream {aka std::basic_ostream}' lvalue to '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;
}
【问题讨论】:
标签: c++ templates boost boost-proto