Dra*_*-On 6 c++ templates template-meta-programming c++14 c++17
给定一个类型,名称和默认值的列表,我可以轻松编写一个生成有效c ++代码的工具,该代码声明一个具有每种类型,名称和默认值的成员变量的类.例如,给出列表
(和类名"Baz"),它会生成
class Baz {
int foo = 42;
float bar = 0.1f;
}
Run Code Online (Sandbox Code Playgroud)
如果一个工具可以生成这样一个类,编译器不能为我做这个吗?我正在考虑这些方面的事情(注意:这是伪代码):
template <typename ...MemberTypes> class Baz {
MemberTypes::type... MemberTypes::name... = MemberTypes::default...;
}
Run Code Online (Sandbox Code Playgroud)
上面的类将被创建类似的东西
using MyBaz = Baz<member_type<int, "foo", 42>, member_type<float, "bar", 0.1f>>;
Run Code Online (Sandbox Code Playgroud)
可能出现这种情况的原因:
这可能是不可能的原因:
如果可以的话,怎么办呢?如果不可能,为什么不呢?即将到来的c ++ 17在这方面有什么改变吗?
更新:示例问题:
通常,配置数据存储为字符串的层次结构或某种其他形式的"任何类型".但是,这会导致丑陋的代码(config.get<int>("core.timeout")
)并阻止编译器帮助解决,例如,typos(config.get<int>("core.timeuot")
).
通过使用其真实类型声明每个配置变量,编译器可以检查类型并防止拼写错误.但是,需要使用自定义代码将配置数据读入正确的成员变量.如果添加了新配置开关,则很容易忘记更新此代码.
只需指定所有成员的类型和名称,然后让编译器自动生成类(包括读取配置文件的方法)将会很方便.这是我要求的功能的可能用例.
C++没有反射工具(还).特别是,不可能以您希望的方式生成和操作实体名称.
然而,预处理器可以以有限的方式做到这一点,(在Boost.PP的帮助下,使得它能够打开它的样板)使我们能够编写以下内容(直接取自我的另一个答案):
#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0(...) \
((__VA_ARGS__)) GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_1
#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_1(...) \
((__VA_ARGS__)) GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0
#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0_END
#define GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_1_END
// Double the parentheses of a Boost.PP sequence
// I.e. (a, b)(c, d) becomes ((a, b))((c, d))
#define GLK_PP_SEQ_DOUBLE_PARENS(seq) \
BOOST_PP_CAT(GLK_PP_DETAIL_SEQ_DOUBLE_PARENS_0 seq, _END)
#define MAKE_ONE_VARIABLE(r, data, elem) \
BOOST_PP_TUPLE_ELEM(0, elem) BOOST_PP_TUPLE_ELEM(1, elem) = BOOST_PP_TUPLE_ELEM(2, elem);
#define MAKE_CLASS(className, members) \
struct className { \
BOOST_PP_SEQ_FOR_EACH(MAKE_ONE_VARIABLE, ~, GLK_PP_SEQ_DOUBLE_PARENS(members)) \
}
Run Code Online (Sandbox Code Playgroud)
......并按原样使用它:
MAKE_CLASS(Baz, (int, foo, 42)(float, bar, 0.1f));
Run Code Online (Sandbox Code Playgroud)
...扩展到:
struct Baz {
int foo = 42;
float bar = 0.1f;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1210 次 |
最近记录: |