1

我正在尝试编写一个定点算术类,其中点位置和基础类型是模板

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() 转换,还提供了重载的算术运算符和数学函数。自然,每当我尝试用这个类调用任何东西时,调用都是模棱两可的,因为每种可能性都是可用的。

我怎样才能让这个类完全灵活,但仍然允许无痛明确的重载函数调用,行为正常(而不是总是将我的类转换为双精度类并返回)?

4

1 回答 1

2

我想你可能要重新考虑你真正想要什么。隐式转换并不总是一个好主意(它们通常是一个坏主意),并且可以隐式转换为相同类型的类始终是一个坏主意(无论何时使用该类都会导致模棱两可的错误和可转换到/从类型一起,因为它可以双向。

您应该回到设计板并决定哪些需要隐式转换,哪些可以命名显式转换。

除此之外,关于您的特定问题,您不能专门化该构造函数。函数(以及其中的构造函数)只能是完全特化的,特别是您不能特化作为模板类成员的模板函数,而不完全特化类模板。即你可以专攻:

basic_fixedpoint<5,int>::basic_fixed_point<int>(int)

但你不能专攻:

template <int N, typename T>
basic_fixed_point<N,T>::basic_fixed_point<int>(int)

作为N并且T不受该专业化的约束。

于 2012-09-22T03:16:00.337 回答