Это мой первый вопрос в этом большом обмене знаниями, и я надеюсь, что нахожу помощь.Как итерации по boost :: fusion ассоциативной структуре и доступу в общем виде ключи
Я пытаюсь реализовать общий способ создания функций PrintTo (позже будет использоваться в GoogleTest).
Таким образом, следующий код выполняет только половину задания. Он печатает только значения заданной структуры Foo::Bar
#include <iostream>
#include <sstream>
#include <string>
#include <boost/fusion/container.hpp>
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp>
#include <boost/fusion/include/define_assoc_struct.hpp>
namespace Foo
{
namespace Keys
{
struct StringField;
struct IntField;
};
}
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
(Foo), Bar,
(std::string, stringField, Foo::Keys::StringField)
(int, intField, Foo::Keys::IntField))
struct fusion_printer_impl
{
std::ostream& _os;
fusion_printer_impl(std::ostream& os)
: _os(os) {}
template <typename T>
void operator() (T& v) const
{
_os << v << std::endl;
}
};
void PrintTo(Foo::Bar const& v, std::ostream* os)
{
boost::fusion::for_each(v, fusion_printer_impl(*os));
}
int main()
{
Foo::Bar fb("Don't panic!", 42);
std::ostringstream temp;
PrintTo(fb, &temp);
std::cout << temp.str() << std::endl;
}
Так что я ищу способ автоматически распечатывает Foo::Keys
, а также. Я заглянул в генерируемый макром код BOOST_FUSION_DEFINE_ASSOC_STRUCT, и, насколько я вижу, ключи доступны как static const char * boost :: fusion :: extension :: struct_member_name :: call().
Я изучил код fusion :: for_each, и до сих пор я вижу только способ «реплицировать» полный код, чтобы был вызван fusion_printer_impl :: operator() с двумя параметрами: ключ и значения. Прежде чем я пойду в этом направлении, я хотел бы знать, есть ли более простые способы для этого.
Я знаю, что можно определить явный boost :: fusion :: map. Здесь вы получаете автоматический доступ через fusion :: pair к типу и значению Key. Но в настоящее время это не вариант для меня.
Так что любая помощь здесь приветствуется.
Спасибо за ответ. Это помогло мне намного дальше. Изменяя result_type функтора на std :: string и передавая результат boost :: fusion :: iter_fold непосредственно в * os, я могу избежать _ugly_ const_cast. –
Даже не упоминайте об этом, оставив кого-то там, чтобы его душа сокрушилась непостижимыми абстракциями, и мрачные нагрузки ошибок компилятора были бы очень бесчеловечными ... – dsign
Я знаю, о чем вы говорите. По крайней мере, VC10 и Clang значительно улучшились. (Я не знаю о gcc). Ошибка при использовании boost :: spirit делает всегда весело :-( –