5

给定一个模板

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>()'错误。

注意:我猜这可能不受标准支持。我在问是否没有某种方法(可能是一些模板元编程)来实现这种效果。

4

1 回答 1

13

一种选择是使用另一种间接级别。定义一个辅助模板,它接受两个参数 - 数字nbool表示是否n为负的 a,然后将该模板专门用于何时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 重载std::enable_ifC++11 中的模板类(或 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具有正确符号的情况下才可用于重载解析,因此将始终调用正确的版本。

希望这可以帮助!

于 2012-04-04T19:13:08.113 回答