Generic Num class
Generic Num class
如何创建一个类似num的泛型类,以便唯一重要的是存在相关的成员函数/运算符?
我读过SFINAE,但老实说我不明白。
#include <iostream>
template<typename T>
class Numeric {
const T a;
public:
Numeric(const T &v) : a(v) {}
T operator+(const Numeric<T> &b) {
return a + b.a;
}
};
int main() {
Numeric<float> fl1(35.5);
Numeric<float> fl2(10.5);
Numeric<uint64_t> i64(10000);
std::cout << (i64 + fl1 + fl2) << std::endl;
return 0;
}
这里,fl1 + fl2
可以,但由于运算符定义T
是同一类型,因此i64
不能与fl1
或fl2
混合。模板是正确的吗?使用定义顶级Num
的对象层次结构(例如,它定义了所有运算符并为每个支持的类型都有一个子类(会更好吗?尽管我认为这并不能解决混合类型的问题。
第1版:Barry/lisyarus背景:我正在更改一个旧的代码库,它的类型定义如下:
template<typename a> struct NumT : public SomeSuperType<a> { mp::cpp_int val;};
更改是以尽可能透明的方式在此NumT
类型中添加对本机float
和double
类型的支持。理想情况下,NumT的变化不应超过decl。CCD_ 10的类型。现有的代码只是在val
上执行a + b
和其他算术运算,而不是破坏现有的API内容是很重要的。i64 + fl1 + fl2 == 10046
数字类型不同(int
、float
等(是有原因的,试图将它们通用化可能会出错。尽管如此,您可以使用std::common_type
来推导可以同时包含这两者的类型。
请注意,此处将丢失"精度">。。例如,如果您的unsigned long long
为1434263462343574573ULL
,则将其转换为double
将丢失一些有效数字。
#include <iostream>
#include <type_traits>
template<typename T>
class Numeric {
const T a;
public:
Numeric(const T &v) : a(v) {}
T get() const { return a; }
};
template<typename T, typename U>
Numeric<typename std::common_type<T, U>::type> //With C++14, do std::common_type_t<T, U>
operator + (const Numeric<T>& a, const Numeric<U>& b) {
return a.get() + b.get(); //Works because of the converting constructor
}
template<typename T>
std::ostream& operator << (std::ostream& os, const Numeric<T>& n){
os << n.get();
return os;
}
int main() {
Numeric<float> fl1(35.5);
Numeric<float> fl2(10.5);
Numeric<uint64_t> i64(10000);
std::cout << (i64 + fl1 + fl2) << std::endl;
return 0;
}
此打印:
10046
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- C++ class vs a library
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 使用"class"关键字,后跟未声明的标识符
- Generic Num class