У меня есть, я надеюсь, простой пример, с простым вопросом, кто-то может помочь мне разобраться :). Это основано на этом другом вопросе:
накапливать в кортеже значений
То, что у меня есть, это структура, с 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));
#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()
,
Других решений пока нет …