7

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

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。我猜预处理器对模板一无所知,而这种事情不在它的领域。说啥?

4

3 回答 3

11

不,这是不可能的。预处理器非常愚蠢,它不知道程序的结构。如果T::Doo没有在预处理器中定义(因为 ,它不能定义::),它不能评估那个表达式并且会失败。

但是,您可以依靠编译器为您做聪明的事情:

        if (T::Doo & 0x010) {
            // some code here
        }

即使在较低的优化设置下,常量表达式和死分支也会被优化掉,因此您可以安全地执行此操作而无需任何运行时开销。

于 2010-05-25T12:11:31.907 回答
2

T 中可用的成员取决于设置的位T::DOO

在我看来,这听起来T::DOO像是一个子类标识符。因此,我认为您Foo和相关的类应该是保证DOO已定义的类的子类。

关键是:为什么必须使用位域?

于 2010-05-25T14:27:28.527 回答
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
    }
};
于 2010-09-03T07:43:59.963 回答