我可以防止参数隐式转换为赋值运算符吗
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;
.
我正在实现一个类型 (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;
.