c++ - 我可以防止参数中的隐式转换为赋值运算符吗
问题描述
我正在实现一个类型 ( 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’)
问题是整数值可以隐式转换为 a bool
,因此 in 的最后一行test()
无法编译。
是否可以告诉编译器TParameter& operator= (bool valid)
仅在参数为 a 时才使用bool
(即禁用隐式强制转换为bool
)?
解决方案
您可以制作第一个重载模板,然后只有在传递 a 时才会首选第二个重载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;
.
推荐阅读
- visual-studio - Visual Studio 2019:为新/未知语言添加代码段(不是 VS 代码)
- arduino - 我正在使用 Energia IDE;我正在尝试将草图上传到我的板上,但出现此错误
- c# - 如何处理异步方法返回可等待和不可等待
- java - 将 Gradle-Kotlin 构建转换为 Maven?
- r - 在 RStudio 中,如何在一行中用字符串打印出集成结果?
- c# - Webjob V3 not starting: Method not found: 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer
- vba - 将数据从表插入到集合 vba 访问
- javascript - 在子进程之间共享一个模块导入
- r - Blogdown site not rendering in R
- c# - C++ Convert Encodings between character sets