给定模板
template <int n>
void f(){...};我知道我可以通过以下操作将其专门用于n的特定值:
template <>
void f<2>(){...};但是,是否有一种方法可以让我专门处理所有正的n?
我想做下面的事
template <int n>
void f<n>(){
int dummy[n]; //invalid for n < 0
...
};因此,对于n<0,这段代码是无效的,编译器将求助于前面的定义。不幸的是,我得到的只是一个redefinition of 'void f<n>()'错误。
注意:我猜这可能不为标准所支持。我想问的是,是否没有某种方法(可能是一些模板元编程)来实现这一效果。
发布于 2012-04-04 19:13:08
一种选择是使用另一种间接的方式。定义一个包含两个参数的辅助模板--数字n和表示n是否为负值的bool,然后将该模板专门用于当n为负值时。然后,让f函数用正确的参数实例化模板。
例如:
template <int n, bool isNegative> struct fImpl {
static void f() {
/* ... code for when n is positive ... */
}
};
template <int n> struct fImpl<n, true> {
static void f() {
/* ... code for when n is negative ... */
}
};
template <int n> void f() {
fImpl<n, (n < 0)>::f();
}另一种选择是使用SFINAE过载和C++11中的std::enable_if模板类(或Boost的等效类);
template <int n> void f(typename std::enable_if<(n < 0)>::type* = 0) {
/* ... n is negative ... */
}
template <int n> void f(typename std::enable_if<(n >= 0)>::type* = 0) {
/* ... n is positive ... */
}如果n有正确的符号,那么这些函数中的每一个都只能用于过载解决,所以正确的版本总是会被调用的。
希望这能有所帮助!
https://stackoverflow.com/questions/10017677
复制相似问题