gpt4 book ai didi

c++ - 部分特化显式模板特化

转载 作者:行者123 更新时间:2023-11-30 04:24:43 25 4
gpt4 key购买 nike

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

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

我试图避免重载构造函数,以便在 header 中呈现单个接口(interface),告诉用户“此类将根据您提供的任何类型干净地构造自身,否则它将无法编译并为您提供一个无法理解的段落长错误信息”

作为子问题:此类还实现了基本的运算符 int()、运算符 float()、运算符 double() 转换,还提供了重载的算术运算符和数学函数。自然地,每当我尝试用这个类调用任何东西时,这个调用都是模棱两可的,因为每种可能性都是可用的。

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

最佳答案

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

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

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

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

但你不能专攻:

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

因为 NT 不受该特化的约束。

关于c++ - 部分特化显式模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12540176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com