我正在研究一种“数据变量”框架。在这里,使用宏BOOST_FUSION_DEFINE_ASSOC_STRUCT
将结构定义并适配为Boost.Fusion序列。可变参数宏:重用可变参数(Boost.Fusion)
简要上下文:
以限定两个适于结构foo
和bar
,我使用:
#define VAR(VARNAME) vardefs::VARNAME
#define VAR_PARENTHESES(VARNAME) (vardefs)(VARNAME)
// ========================================================
#ifndef VARNAME_
#define VARNAME_ foo // <- Variable name
namespace VAR(VARNAME_)::keys{
struct foo1;
struct foo2;
struct foo3;
}
namespace VAR(VARNAME_) { struct index; }
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
VAR_PARENTHESES(VARNAME_), type,
(char, foo1, VAR(VARNAME_)::keys::foo1)
(int, foo2, VAR(VARNAME_)::keys::foo2)
(float, foo3, VAR(VARNAME_)::keys::foo3)
)
#endif
#undef VARNAME_
// --------------------------------------------------------
// ========================================================
#ifndef VARNAME_
#define VARNAME_ bar // <- Variable name
namespace VAR(VARNAME_)::keys{
struct bar1;
struct bar2;
}
namespace VAR(VARNAME_) { struct index; }
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
VAR_PARENTHESES(VARNAME_), type,
(double, bar1, VAR(VARNAME_)::keys::bar1)
(float, bar2, VAR(VARNAME_)::keys::bar2)
)
#endif
#undef VARNAME_
// --------------------------------------------------------
现在一个可以通过使用创建的foo
和bar
实例:
VAR(foo)::type fooI;
VAR(bar)::type barI;
关联键可以像这样使用:
auto a = boost::fusion::at_key<VAR(foo)::keys::foo3>(fooI).
auto b = boost::fusion::at_key<VAR(bar)::keys::bar2>(barI).
这种方法可能是有用的。
最后,存在用于结构本身标签:
VAR(bar)::index
VAR(foo)::index
我可以使用稍后在其他Boost.Fusion序列类型密钥,例如boost::fusion::map
。
问:
注意,针对两个结构的,由于我定义的关联顺序,我必须使用结构字段名(foo1
,bar2
,...)三每次。
我想什么,而不是,是定义上述两个结构为这样:
// ========================================================
DEFINE_DATAVAR_STRUCT(
foo,
(char, foo1)
(int, foo2)
(float, foo3)
)
// --------------------------------------------------------
// ========================================================
DEFINE_DATAVAR_STRUCT(
bar,
(double, bar1)
(float, bar2)
)
// --------------------------------------------------------
我只需要定义一个可变宏DEFINE_DATAVAR_STRUCT
。这是我需要帮助的。对我来说,问题是重用可变参数,以便它们可以出现在比生成的代码更多的地方。不知何故,Boost.Fusion以某种方式没有任何问题(依靠Boost.PP)。
我自己的研究:
我已经看了看Boost.PP库,但我没有做很好的进展在这里。由于Boost.Fusion库已经这样做了,所以必须有一种方法来实现相同的可变参数功能,类似于宏观的BOOST_FUSION_DEFINE_ASSOC_STRUCT
。
Boost.Fusion宏BOOST_FUSION_DEFINE_ASSOC_STRUCT
在.../define_assoc_struct.hpp的第40-50行中定义。在.../define_struct.hpp(特别是413行的宏BOOST_FUSION_DEFINE_STRUCT_IMPL
)中可以找到构建这些宏的大部分魔力。该文件还利用了很多Boost.PP。
编译器: Microsoft Visual Studio 2015 Update 3(GCC,Clang现在不是选项)。
Boost: 1.64.0。
我简单地生成的代码或修改现有的BOOST_FUSION_DEFINE_STRUCT宏(复制它并使其发出你想要的代码) – sehe
@sehe这是一个好主意,实际上我的想法实际上是我的问题是使用'__VA_ARGS__',这样我就可以得到相同的variadic行为作为Boost.Fusion宏。也许我可以复制Boost.Fusion实现,不确定。我会稍微更新一下这个问题。 –