gpt4 book ai didi

c++ - 如何在具有不同模板参数的 C++ 模板之间隐式转换

转载 作者:行者123 更新时间:2023-11-28 03:17:38 24 4
gpt4 key购买 nike

我正在尝试创建一个包含整数值的 C++ 模板类并检查该值是否始终在有效范围内,因此简化代码如下:

struct OutOfRangeError  
{ };

template<int MIN, int MAX, typename TYPE>
struct IntegerRange
{
private:
TYPE mValue;

public:
IntegerRange(const TYPE value) : mValue(value)
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}

operator TYPE() const
{
return mValue;
}
}

前面的代码可以工作,但是在使用这个类时有一点缺点。这是一个示例:

typedef IntegerRange<0, 4, int> range1_t;  
typedef IntegerRange<0, 5, int> range2_t;

range1_t a = 3;
//range2_t b = a; // This does not work
range2_t b = static_cast<int>(a); // This works OK

因此,要在不同范围之间分配值,我必须显式转换为给定的 TYPE。我想有一个解决方案来避免这种显式转换和处理 IntegerRange 类,因为它们是普通整数。所以开发人员应该有一种感觉,他正在处理普通整数而不是类。

为了解决这个问题,我尝试了不同的方法。一项工作是以下作为附加构造函数的工作:

template<typename RANGE_TYPE>  
IntegerRange(const RANGE_TYPE &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > mValue || mValue > MAX)
{
throw OutOfRangeError();
}
}

然而,即使这可行,我也不太喜欢 RANGE_TYPE 可以是任何能够转换为 TYPE 的类型,我想将其限制为仅 IntegerRange 类。为了仅将其限制为 IntegerRange 类,我尝试了以下但它没有编译,我不明白原因:

template<int ARG_MIN, int ARG_MAX, typename ARG_TYPE>  
IntegerRange(const IntegerRange<ARG_MIN, ARG_MAX, typename ARG_TYPE> &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}

问题是2:
* 为什么最后一段代码没有编译,我需要更改什么才能编译它。
* 有没有更好的方法来避免我遗漏的显式转换?

谢谢

最佳答案

首先,您不应该使用 ARG_MAX 作为模板名称,因为它可能已经定义为 POSIX 数字常量。 p>

其次,您应该删除 IntegerRange 的第三个模板参数中的 typename :

IntegerRange(const IntegerRange<ARG_MIN, ARG_MAX, ARG_TYPE> &value) :

也许你应该将 value 转换为 ARG_TYPE ,这将直接调用你的 operator ARG_TYPE() 然后让编译器从 ARG_TYPETYPE 而不是强制转换为 TYPE 并让编译器推断从 ARG_TYPE 和调用 的可能转换>运算符 ARG_TYPE()。对于第一个解决方案,关于不可能转换的编译错误可能更加明确。

关于c++ - 如何在具有不同模板参数的 C++ 模板之间隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355568/

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