gpt4 book ai didi

c++ - 根据参数的积极性专门化模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:14 24 4
gpt4 key购买 nike

给定一个模板

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

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

最佳答案

一个选择是使用另一个间接级别。定义一个接受两个参数的辅助模板 - 数字 n 和一个 bool 表示 n 是否为负数,然后将该模板专门用于当 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 overloading和 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 具有正确的符号,则这些函数中的每一个仅可用于重载决议,因此将始终调用正确的版本。

希望这对您有所帮助!

关于c++ - 根据参数的积极性专门化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com