Boost :: Fusion :: Накопить простой пример

У меня есть, я надеюсь, простой пример, с простым вопросом, кто-то может помочь мне разобраться :). Это основано на этом другом вопросе:
накапливать в кортеже значений

То, что у меня есть, это структура, с 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.hpp:111:39:
ошибка: слишком много аргументов для работы
fusion::deref(it0));

1

Решение

#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;

const std::string result = boost::fusion::accumulate(this->value_, std::string{} /* initila state */, A());
return result;
}
};

struct IdentityAlgorithms
{
typedef std::string result_type;

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

std::string operator()(const std::string& str, const std::string &value) const
//  ^ state                 ^ element of squence
{
std::cerr << "ToString invoked! value: '" << value << "'" << std::endl;
return "\"" + value + "\"";
}
};

операция static std::string ToString(std::string value) не имеет смысла в этом случае. Вы должны определить operator(),

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]