C++,对模板参数执行预处理程序逻辑。

问题描述 投票:0回答:1

我想做这样的事情。

#define _FLAT_TOP 1
#define _FLAT_BOTTOM 2

template <int TYPE>
void myFunction() {

 #if TYPE == _FLAT_TOP

       int pixelTop = 453;

 #elif TYPE == _FLAT_BOTTOM

       int pixelTop = 990;

 #endif

     // code that uses pixelTop

}

然后可以像这样调用函数

myFunction<_FLAT_TOP>();

但是,#if语句块都没有被编译(它们在Visual Studio中都是灰色的,后面使用pixelTop的代码是红色下划线)。我不想使用常规的if语句的原因是,实际上那个函数中发生的事情比我写的要多得多,而且在运行时使用if语句会导致明显的性能下降。我需要知道我在这里想做的事情是否可行,如果可行,该如何做?

c++ templates preprocessor
1个回答
2
投票

在C+17及以后的版本中,你可以使用 if constexpr:

#define _FLAT_TOP 1
#define _FLAT_BOTTOM 2

template <int TYPE>
void myFunction() {
    int pixelTop = 0;
    if constexpr (TYPE == _FLAT_TOP)
       pixelTop = 453;
    else if constexpr (TYPE == _FLAT_BOTTOM)
       pixelTop = 990;

    // do something with pixelTop
}

注意: pixeltop 上面需要声明 if 语句,以便在你想对它 "做点什么 "的时候仍然在范围内。


1
投票

模板专业化?

template <int TYPE>
struct pixelTop {
    // no default value
};

template <>
struct pixelTop<_FLAT_TOP> {
    static const int value = 453;
};

template <>
struct pixelTop<_FLAT_BOTTOM> {
    static const int value = 990;
};

template <int TYPE>
void myFunction() {

       int pixelTopValue = pixelTop<TYPE>::value;
       ...    
}

附加的好处是,如果 TYPE 是两个特殊值以外的东西,你会得到一个编译器错误。

© www.soinside.com 2019 - 2024. All rights reserved.