在boost :: proto手册中,有一个语法示例匹配std :: transform< ...>类型的终端:
struct StdComplex
: proto::terminal< std::complex< proto::_ > >
{};
我想编写一个与proto :: _类型相关的变换。 例如,当匹配proto :: terminal&lt;的std ::复杂&LT; T> &gt;,它返回一个boost :: shared_ptr&lt; T>
这可能吗?
说明我的问题的另一种方法是,如何使以下代码段工作?
template<typename T>
struct Show : proto::callable
{
typedef T result_type;
result_type operator()(T& v)
{
std::cout << "value = " << v << std::endl;
return v;
}
};
struct my_grammar
: proto::when<proto::terminal<proto::_ >, Show<??? what comes here ???>(proto::_value) >
{};
答案 0 :(得分:3)
您的Show变换将更容易作为多态函数对象处理:
struct Show : proto::callable
{
template<class Sig> struct result;
template<class This, class T>
struct result<This(T)>
{
typedef T type;
};
template<class T> T operator()(T const& v) const
{
std::cout << "value = " << v << std::endl;
return v;
}
};
struct my_grammar
: proto::when<proto::terminal<proto::_ >, Show(proto::_value) >
{};
你对另一个问题的回答是:
struct to_shared : proto::callable
{
template<class Sig> struct result;
template<class This, class T>
struct result<This(T)>
{
typedef typename T::value_type base;
typedef shared_ptr<base> type;
};
template<class T>
typename result<to_share(T)>::type operator()(T const& v) const
{
// stuff
}
};
struct my_grammar
: proto::when<proto::terminal<complex<proto::_> >, to_shared(proto::_value) >
{};