我想做这样的事情。
#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+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
语句,以便在你想对它 "做点什么 "的时候仍然在范围内。
模板专业化?
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
是两个特殊值以外的东西,你会得到一个编译器错误。