对C 98和C 11的停止隐式转换
Stop implicit conversion for C++98 and C++11
本文关键字:转换 更新时间:2023-10-16
我有一个带有get()
方法的模板类,该类方法返回了它的模板。还有更多的东西,但是为简单起见,代码看起来像:
Attribute<float> attr(0.0f);
float value = attr.get();
但是,以下内容也将编译:
Attribute<float> attr(0.0f);
int value = attr.get();
我希望编译器抓住这一点,并告诉我我有非法conversion依。一种简单的方法是创建一个新的Holder<T>
类,该类带有转换操作员到其模板上的类型。GET方法的工作方式如下:
template<typename T>
Holder<T> Attribute::get()
{
return Holder<T>(m_value);
}
带有持有人的班级看起来像:
template<typename T>
class Holder
{
private:
T m_value;
public:
Holder(T value) : m_value(value) {}
//implicit conversion
operator T() const { return m_value; }
};
(我只是在编辑器中写了这篇文章,但还没有测试过,但是要在C 98中做我想做的事情)
Attribute<float> attr(0.0f);
// This should now not compile because we have no conversion from
// Holder<float> to int.
int value = attr.get();
当我们移动C 11时,棘手的位是我想使用自动的,突然间,当我这样做时:
Attribute<float> attr(0.0f);
auto value = attr.get();
value
现在将是我不想要的类型Holder<float>
。任何人都可以想到一种允许两者工作的方法,也许会带着一些增强的魔法。
您可以在Attribute
类中定义typedef
,如:
typedef T value_type;
,然后在分配部分:
Attribute<float> attr(0.0f);
decltype(attr)::value_type value = attr.get();
这样您就不需要那个持有人。
,如果您坚持使用该持有人,则可以做相同的操作并从持有人中提取value_type
。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++