首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于实证性的模板专业化

基于实证性的模板专业化
EN

Stack Overflow用户
提问于 2012-04-04 19:09:08
回答 1查看 1.1K关注 0票数 5

给定模板

代码语言:javascript
复制
template <int n>
void f(){...};

我知道我可以通过以下操作将其专门用于n的特定值:

代码语言:javascript
复制
template <>
void f<2>(){...};

但是,是否有一种方法可以让我专门处理所有正的n

我想做下面的事

代码语言:javascript
复制
template <int n>
void f<n>(){
    int dummy[n]; //invalid for n < 0
    ...
};

因此,对于n<0,这段代码是无效的,编译器将求助于前面的定义。不幸的是,我得到的只是一个redefinition of 'void f<n>()'错误。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-04 19:13:08

一种选择是使用另一种间接的方式。定义一个包含两个参数的辅助模板--数字n和表示n是否为负值的bool,然后将该模板专门用于当n为负值时。然后,让f函数用正确的参数实例化模板。

例如:

代码语言:javascript
复制
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的等效类);

代码语言:javascript
复制
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有正确的符号,那么这些函数中的每一个都只能用于过载解决,所以正确的版本总是会被调用的。

希望这能有所帮助!

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10017677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档