我可以防止参数隐式转换为赋值运算符吗?
Can I prevent implicit conversion in parameter to assignment operator
我正在实现一个类型(TParameter
),它既是布尔值(以指示值是否有效),又是任意类型的数据值。
这个想法是,如果一个方法采用某种类型的参数,那么我可以将其设置为false
,以指示该值无效。
喜欢这个:
someVariable = 123; // use the value 123
someVariable = false; // mark variable as invalid/to-be-ignored
我的代码的简化版本:
template <class T>
class TParameter
{
public:
TParameter()
: m_value(),
m_valid(false)
{}
// assignment operators
TParameter& operator= (const T& value)
{
m_value = value;
m_valid = true;
return *this;
}
TParameter& operator= (bool valid)
{
m_valid = valid;
return *this;
}
private:
T m_value;
bool m_valid;
};
void test()
{
TParameter<int16_t> param;
param = false;
param = int16_t(123);
param = 123;
}
编译代码时出现错误:
ambiguous overload for ‘operator=’ (operand types are ‘TParameter<short int>’ and ‘int’)
问题是整数值可以隐式转换为bool
,因此test()
的最后一行不能编译。
是否可以告诉编译器,仅当参数是bool
时才使用TParameter& operator= (bool valid)
(即禁用隐式强制转换为bool
)?
您可以制作第一个重载模板,然后只有在传递bool
时才首选第二个重载(因为在相同情况下非模板函数优先于模板)。否则,将选择模板版本,因为它完全匹配。
template <typename X>
TParameter& operator= (const X& value)
{
m_value = value;
m_valid = true;
return *this;
}
TParameter& operator= (bool valid)
{
m_valid = valid;
return *this;
}
住
顺便说一句:在您的代码中,隐式转换发生在调用operator=
时;int
转换为int16_t
,然后传递给operator=
。在上面的代码中,隐式转换发生在operator=
内部,即m_value = value;
.
相关文章:
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 标准库类型的赋值运算符的引用限定符
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 基类和派生类的多态赋值运算符
- C++ 通过自定义赋值运算符隐式转换函数参数
- 使用赋值运算符将宏转换为函数调用
- 我可以防止参数隐式转换为赋值运算符吗?
- 使用 C++ 将中缀转换为后缀(包括赋值运算符)
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 带有模板类的赋值运算符 - 没有可接受的转换,C++
- 初始化对象后,用隐式转换而不是赋值运算符调用构造函数有什么意义
- 如何避免重载赋值运算符将右值转换为左值
- 赋值运算符重载 -- 错误 C2440:'==':无法从 'A<T> *' 转换为 'A<T> *const '
- 在复合赋值运算符中强制转换
- 使用复合赋值运算符解决转换警告
- 复合赋值运算符的类型/类型转换?(例如*=(星形等于))
- 从"int"到非标量类型赋值运算符的转换 - 对象到 int