这是我对这个伟大的知识交流的第一个问题,我希望我能找到一些帮助。
我尝试实现一种通用的方法来创建 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 的 makro 生成代码,据我所知,这些密钥可作为静态 const char* boost::fusion::extension::struct_member_name::call() 使用。
我查看了 fusion::for_each 的代码,到目前为止,我只看到了一种“复制”完整代码的方法,以便使用两个参数 Key 和 values 调用 fusion_printer_impl::operator()。在我进入那个方向之前,我想知道是否有更简单的方法来实现这一点。
我知道可以显式定义 boost::fusion::map。这里可以通过 fusion::pair 自动访问 Key 类型和值。但这对我来说目前没有选择。
因此,欢迎在这里提供任何帮助。