我正在尝试编写一个定点算术类,其中点位置和基础类型是模板
template <int P, typename T>
class basic_fixedpoint{
//stuff
};
我还想公开一个模板化的隐式构造函数,然后专门用于各种类型
//inside basic_fixedpoint
template <typename U>
basic_fixedpoint(const U& arg);
在其他地方,我将为 int、float、double 等实现特化。但是,我还想为具有不同 P 和 T 的任何类型的 basic_fixedpoint 提供通用特化。如何将其作为模板化模板特化?
template <int P, typename T> //for the class whose constructor i specialize
template <int OP, typename OT> //for the parameters of the argument
basic_fixedpoint<P, T>::basic_fixedpoint<basic_fixedpoint<OP, OT> >(const basic_fixedpoint<OP, OT>& arg)
: /*init things here*/ {} // this fails
我试图避免重载构造函数,以便在标题中显示单个接口,告诉用户“这个类将从你给它的任何类型干净地构造自己,否则它将无法编译并给你一个难以理解的段落错误信息”
作为一个子问题:这个类还实现了基本的运算符 int()、运算符 float()、运算符 double() 转换,还提供了重载的算术运算符和数学函数。自然,每当我尝试用这个类调用任何东西时,调用都是模棱两可的,因为每种可能性都是可用的。
我怎样才能让这个类完全灵活,但仍然允许无痛明确的重载函数调用,行为正常(而不是总是将我的类转换为双精度类并返回)?