首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使is_arithmetic<myClass>::value成为现实?

如何使is_arithmetic<myClass>::value成为现实?
EN

Stack Overflow用户
提问于 2014-10-17 22:12:36
回答 2查看 4.2K关注 0票数 12

我的想法是,我有一个函数,对输入做一些算术运算,所以可能是这样的:

代码语言:javascript
复制
#include <type_traits>
#include <vector>

using namespace std;

template<typename T> 
double mean(const vector<T>& vec)
{
    static_assert(is_arithmetic<T>::value, "Arithmetic not possible on this type");
    //compute mean (average)
}//mean

这很好,并计算了我输入的所有数字类型的平均值。但是,假设我创建了一个新类:

代码语言:javascript
复制
class foo
{
    // class that has arithmetic operations created
};// foo

在这个类的定义中,我定义了所需的运算符+和/,这样它们就可以使用预期的输入。现在,我想在我的新类中使用我的mean,但是由于static_assert,它显然不会编译。那么我如何告诉编译器我的新类应该满足is_arithmetic<foo>::value呢?

如果当我创建这个类时,我可以给它一个满足is_arithmetic的类型,那就太好了,但这似乎会在某种程度上导致type_traits的问题?

或者我需要创建一个新的测试来检查

代码语言:javascript
复制
is_arithmetic<T>::value || type(T,foo)

或者类似的东西?

如果可能的话,我宁愿只修改我的类,而不是函数,但我很想找到一个解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-17 22:21:23

标准库类型特征(如std::is_arithmetic,除了一个例外(std::common_type) )是“一成不变”的。试图对它们进行专门化会导致未定义的行为。is_arithmetic测试类型是否是标准定义的算术类型;用户定义的类型绝不是算术类型。

您可以编写自己的特性,测试对算术运算符的支持:

代码语言:javascript
复制
template<class...> struct voidify { using type = void; };
template<class... Ts> using void_t = typename voidify<Ts...>::type;

template<class T, class = void>
struct supports_arithmetic_operations : std::false_type {};

template<class T>
struct supports_arithmetic_operations<T, 
           void_t<decltype(std::declval<T>() + std::declval<T>()),
                  decltype(std::declval<T>() - std::declval<T>()),
                  decltype(std::declval<T>() * std::declval<T>()),
                  decltype(std::declval<T>() / std::declval<T>())>> 
       : std::true_type {};

只有当所有四个表达式都格式良好(即T支持操作符+, -, *, /)时,部分专门化才会匹配。

演示

票数 22
EN

Stack Overflow用户

发布于 2014-10-17 22:22:05

根据定义,std::is_arithmetic<T>::value仅是true,如果T是C++标准中的算术类型,后者是整型或浮点型,而后者又是基本类型:

类型boolcharchar16_tchar32_twchar_t以及有符号和无符号整数类型统称为整型。 有三种浮点类型:floatdoublelong double

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

https://stackoverflow.com/questions/26434128

复制
相关文章

相似问题

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