什么是boost :: phoenix相当于此?

时间:2014-03-11 23:38:31

标签: c++ boost boost-phoenix

我有以下内容:

class Foo
{
public:
   std::string const& Value() const { return /*Return some string*/; }
};

typedef std::list<Foo> FooList;
FooList foos; // Assume it has some valid entities inside

std::vector<int> ints;

FooList::const_iterator it, iend = foos.end();
for (it = foos.begin(); it != iend; ++it)
{
   ints.push_back(boost::lexical_cast<int>(it->Value()));
}

如何使用std::for_eachboost::phoenix实现for循环?我尝试了一些方法,但它真的很难看(我有很多嵌套的bind()语句)。我基本上只想看看有多干净&amp;可读的boost phoenix可以使这个for循环,所以我不会编写那么多的样板代码来迭代具有1-2行专用逻辑的容器。

有时候,在C ++ 11之前做lambdas似乎太难以理解并且不可维护而不值得为此付出代价。

1 个答案:

答案 0 :(得分:1)

假设您准备了一个Phoenix友好的函数对象:

namespace lexical_casts
{
    template <typename T> struct to_
    {
        template <typename/*V*/> struct result { typedef T type; };
        template <typename V>
        T operator()(V const& v) const { return boost::lexical_cast<T>(v); }
    };

    boost::phoenix::function<to_<int> > to_int;
}

你可以这样写:

BOOST_AUTO(value_of, phx::lambda[ phx::bind(&Foo::Value, arg1) ]);

std::vector<int> ints;
boost::transform(
        foolist,
        back_inserter(ints), 
        lexical_casts::to_int(value_of(arg1)));

查看 Live On Coliru