【发布时间】:2010-10-23 17:39:58
【问题描述】:
考虑以下模板化数据结构
enum eContent{
EINT = 1,
EFLOAT = 2,
EBOOL = 4
};
template<int>
struct Container{
Container(){assert(false);} //woops, don't do that!
};
template<>
struct Container<EINT>{
Container():i(123){}
int i;
};
template<>
struct Container<EFLOAT>{
Container():f(123.456f){}
float f;
};
template<>
struct Container<EBOOL>{
Container():b(true){}
bool b;
};
<fancy macro goes here that creates me all kind of combinations including for example>
template<>
struct Container<EFLOAT | EBOOL>: public Container<EFLOAT>, public Container<EBOOL>{
Container():Container<EFLOAT>(),Container<EBOOL>(){}
};
</fancy macro>
这样我就可以定义一个像这样的变量:
Container<EINT|EFLOAT|EBOOL> myVar;
我将如何定义这个花哨的宏?
我为什么要这个? 让它成为有趣和学习元编程的原因
【问题讨论】:
-
您是否要创建tuple type?使用枚举值表示类型而不是直接表示类型的基本原理是什么(您的最后一个示例将变为
Container<int, float, bool>,这似乎更惯用)。此外,由于您的目标似乎是学习,因此这种方法可以让您使用可变参数模板,这是 C++0x 的一个新功能(您显然已经在使用它,因为您的代码包含static_assert)! -
oi - 我不知道可变参数模板 - 听起来很有趣!谢谢你的提示!
-
即使目标只是看看能不能完成,但最好描述一下你想解决的问题,而不是你想象中的解决方案。这样,您可能会学到意想不到的好东西,可以用更好的方式解决它,例如上面提到的可变参数模板。 :) 正如@Luc 所问,这应该是一个元组类型,还是它的目标是什么?
-
我想要一种简单的方法来为成千上万的轻量级数据对象定义特定的数据格式。
标签: c++ templates macros metaprogramming