我的想法是,我有一个函数,对输入做一些算术运算,所以可能是这样的:
#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这很好,并计算了我输入的所有数字类型的平均值。但是,假设我创建了一个新类:
class foo
{
// class that has arithmetic operations created
};// foo在这个类的定义中,我定义了所需的运算符+和/,这样它们就可以使用预期的输入。现在,我想在我的新类中使用我的mean,但是由于static_assert,它显然不会编译。那么我如何告诉编译器我的新类应该满足is_arithmetic<foo>::value呢?
如果当我创建这个类时,我可以给它一个满足is_arithmetic的类型,那就太好了,但这似乎会在某种程度上导致type_traits的问题?
或者我需要创建一个新的测试来检查
is_arithmetic<T>::value || type(T,foo)或者类似的东西?
如果可能的话,我宁愿只修改我的类,而不是函数,但我很想找到一个解决方案。
发布于 2014-10-17 22:21:23
标准库类型特征(如std::is_arithmetic,除了一个例外(std::common_type) )是“一成不变”的。试图对它们进行专门化会导致未定义的行为。is_arithmetic测试类型是否是标准定义的算术类型;用户定义的类型绝不是算术类型。
您可以编写自己的特性,测试对算术运算符的支持:
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支持操作符+, -, *, /)时,部分专门化才会匹配。
演示。
发布于 2014-10-17 22:22:05
根据定义,std::is_arithmetic<T>::value仅是true,如果T是C++标准中的算术类型,后者是整型或浮点型,而后者又是基本类型:
类型
bool、char、char16_t、char32_t、wchar_t以及有符号和无符号整数类型统称为整型。 有三种浮点类型:float、double和long double。
https://stackoverflow.com/questions/26434128
复制相似问题