boost :: fusion :: accumulate简单示例

时间:2015-12-18 04:35:13

标签: c++ c++11 boost c++14 fusion

我有我希望的一个简单的例子,有一个简单的问题,有人可以帮我清理:)。它基于另一个问题: accumulate over tuple of values

我所拥有的是一个具有std::tuple<std::string>成员的结构。在结构的构造函数中,我在执行一些由另一种类型控制的算法后存储数据。与我的问题无关,只是解释下面的代码。

我需要帮助(对不起,新推出元编程!)是我的toString()方法,它在我的元组上调用boost::fusion::accumulate。当我打电话给boost::fusion::accumulate时,我不确定我该怎么称呼它! 对boost::fusion::accumulate的调用应由AlgorithmT参数决定。

我或多或少有以下代码:

#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/include/algorithm.hpp>
#include <boost/phoenix/phoenix.hpp>

template<typename AlgorithmT, typename ...T>
struct Trait
{
  using A = AlgorithmT;

  size_t hash_value_;
  std::tuple<std::string> value_;

  Trait(T... data) :
    hash_value_(A::Hash(data...)),
    value_(A::Transform(data...)) {}
  size_t hash() const { return this->hash_value_; }

  std::string toString() const
  {
    using namespace boost::phoenix::arg_names;
    // This example compiles, but it effectively does nothing. result is always empty.
    std::string const result = boost::fusion::accumulate(this->value_, std::string{}, arg1);

    // This next line doesn't compile, but I think it's what I want.
    std::string const result = boost::fusion::accumulate(this->value_, std::string{}, &A::ToString(arg1));
    return result;
  }
};

struct IdentityAlgorithms
{
  static constexpr size_t (*Hash)(std::string const&) = &boost::hash_value;
  static constexpr auto Transform = &identity_transform<std::string>;

  static std::string ToString(std::string value) {
    std::cerr << "ToString invoked! value: '" << value << "'" << std::endl;
    return "\"" + value + "\""; }
};

有人可以看看我如何使用boost::fusion::accumulate,也许可以指出我如何让​​编译器推断出类型。我假设编译器不能推断出正确的类型是有充分理由的,我只是不确定那是什么。错误消息GCC4.9向我吐出的是:

  

从这里要求
  /local/brazil-pkg-cache/packages/Boost/Boost-3.0.3932.1/RHEL5_64/DEV.STD.PTHREAD/build/include/boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp11139
  错误:函数的参数太多了                        fusion::deref(it0));

1 个答案:

答案 0 :(得分:1)

static std::string ToString(std::string value)
在这种情况下,

操作operator()毫无意义。您必须定义dd.mm.yy