在预处理程序指令中使用模板参数?

时间:2010-05-25 12:08:24

标签: c++ templates c-preprocessor preprocessor-directive

是否可以在预处理程序指令中使用非类型常量模板参数?这就是我的想法:

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的行中无法匹配的括号。我猜测预处理器并不真正知道任何关于模板的事情,这种事情只是不在其领域。说啥?

3 个答案:

答案 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
    }
};