C++ boost数据类型的继承
这可能是XY问题,因此我将把原始情况放到上下文中: 我正在编写一些用于数据类型的模板化代码:double、boost::mpfr、boost::mpfi、boost::interval。对于这些数据类型中的大多数,boost提供了一个非常相似的接口,但也有一些不同之处。我要处理的最具挑战性的区别是,我想在这些类型之间的转换中指定细节(例如,boost::mpfr通常舍入到最近的值,但是对于boost::mpfr和boost::interval之间的转换,我需要使用后端并指定舍入方案) 我考虑的解决方案是使用继承和赋值/显式转换。代码的开头如下所示:C++ boost数据类型的继承,c++,inheritance,boost,ambiguous,mpfr,C++,Inheritance,Boost,Ambiguous,Mpfr,这可能是XY问题,因此我将把原始情况放到上下文中: 我正在编写一些用于数据类型的模板化代码:double、boost::mpfr、boost::mpfi、boost::interval。对于这些数据类型中的大多数,boost提供了一个非常相似的接口,但也有一些不同之处。我要处理的最具挑战性的区别是,我想在这些类型之间的转换中指定细节(例如,boost::mpfr通常舍入到最近的值,但是对于boost::mpfr和boost::interval之间的转换,我需要使用后端并指定舍入方案) 我考虑的解
#include<iostream>
#include<boost/multiprecision/mpfr.hpp>
using namespace boost::multiprecision;
class mpfr : public mpfr_float{
public:
mpfr() : mpfr_float(0) {}
template<typename Number>
mpfr(Number val=0) : mpfr_float(val) {}};
int main(){
mpfr val1=2.3,val2=3.4;
val1+val2;
return 0;}
#包括
#包括
使用名称空间boost::multiprecision;
mpfr类:公共mpfr\U浮动{
公众:
mpfr():mpfr_float(0){}
模板
mpfr(Number val=0):mpfr_float(val){};
int main(){
mpfr val1=2.3,val2=3.4;
val1+val2;
返回0;}
当我试图编译这个时,我得到了一个带有以下三个选项的模糊调用错误(来自boost/multiprecision/detail/et_ops.hpp):
一,
模板
内联细节::表达式
操作员+(常数编号和a、常数编号和b)
二,
模板
内联typename启用_if::type
操作员+(常数编号和a、常数V和b)
三,
模板
内联typename启用_if::type
操作员+(常数V&a、常数编号和b)
在这一切之后,我有以下两个问题:
为什么不创建自己的四舍五入函数,该函数为您想要支持的所有类型提供重载,并具有正确的语义?您能建议一种在数字类型之间转换的统一方法吗?mpfr在mpfr.hpp中硬编码了舍入规则,那么我需要重写多少boost_mpfr?我不确定。你还没有明确指出做出了哪些选择(以及为什么它们不适合你)。所以,如果你已经知道了,我就留给你了。那不是。。。实际上是一个编程错误,而不是一个功能性的决定。但是,如果您发现Boost的mpfr后端的设计对开发人员来说是一个负担(因为他们会做出任意选择),请向Boost Multiprecision的维护人员提出改进建议
template <class B>
inline detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >
operator + (const number<B, et_on>& a, const number<B, et_on>& b)
template <class B, class V>
inline typename enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >, detail::expression<detail::add_immediates, number<B, et_on>, V > >::type
operator + (const number<B, et_on>& a, const V& b)
template <class V, class B>
inline typename enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >, detail::expression<detail::add_immediates, V, number<B, et_on> > >::type
operator + (const V& a, const number<B, et_on>& b)