首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11模板条件

C++11模板条件
EN

Stack Overflow用户
提问于 2015-09-27 10:14:30
回答 2查看 135关注 0票数 1

我想只为数字写有条件的模板。

代码语言:javascript
复制
//in header file
template <typename T,
    typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type 
>
class Foo
{
    public:
        Foo();
};

#include "Foo.inline"

代码语言:javascript
复制
//In inline file
template <
    typename T
>
Foo<T>::Foo()
{
};

但是,这并不是编译。如何在单独的文件中使用模板实现的语法?

EN

回答 2

Stack Overflow用户

发布于 2015-09-27 10:31:28

std::enable_if对于触发替换失败非常有用,这样编译器就可以退回到另一个重载/专门化。

如果要验证模板参数,请在static_assert中添加适当的条件。

代码语言:javascript
复制
template <typename T>
class Foo
{
    static_assert(std::is_arithmetic<T>::value,
                  "T must be an arithmetic type");
public:
    Foo();
};

template <typename T>
Foo<T>::Foo()
{
}

或约束c++20

代码语言:javascript
复制
template <typename T>
    requires std::is_arithmetic_v<T>
class Foo
{
    // ...
};
票数 3
EN

Stack Overflow用户

发布于 2015-09-27 10:20:32

定义中应使用第二个模板参数。

代码语言:javascript
复制
//in header file
template <typename T,
    typename Enable = typename std::enable_if<std::is_arithmetic<T>::value, T>::type
>
class Foo
{
    public:
        Foo();
};


//In inline file
template <typename T, typename Enable>
Foo<T, Enable>::Foo()
{
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32806840

复制
相关文章

相似问题

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