我正在研究一種「數據變量」框架。在這裏,使用宏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實現,不確定。我會稍微更新一下這個問題。 –