是否可以在预处理程序指令中使用非类型常量模板参数?这就是我的想法:
template <int DING>
struct Foo
{
enum { DOO = DING };
};
template <typename T>
struct Blah
{
void DoIt()
{
#if (T::DOO & 0x010)
// some code here
#endif
}
};
当我尝试Blah<Foo<0xFFFF>>
之类的东西时,VC ++ 2010会抱怨我们尝试使用#if
的行中无法匹配的括号。我猜测预处理器并不真正知道任何关于模板的事情,这种事情只是不在其领域。说啥?
答案 0 :(得分:11)
不,这是不可能的。预处理器非常愚蠢,并且不了解程序的结构。如果预处理器中未定义T::Doo
(由于::
而无法定义 if (T::Doo & 0x010) {
// some code here
}
),则无法评估该表达式并将失败。
但是,你可以依靠编译器为你做聪明的事情:
{{1}}
即使在较低的优化设置下,也会对常量表达式和死分支进行优化,因此您可以安全地执行此操作,而无需任何运行时开销。
答案 1 :(得分:2)
T中可用的成员取决于
中设置的位T::DOO
听起来像T::DOO
就像是一个子类标识符。所以我认为你的Foo
和相关类应该是保证定义DOO
的类的子类。
关键是:为什么必须使用位字段?
答案 2 :(得分:1)
不确定这是否适用于您的情况,但可以使用模板类隔离不同的情况。例如:(使用上面代码的修改版本)
template <typename T, int N>
struct Blah
{
void DoIt()
{
// normal DoIt() code
}
};
template <typename T>
struct Blah<T,5>
{
void DoIt()
{
// special DoIt() code for only when N==5
}
};