gpt4 book ai didi

c++ - 我可以防止参数隐式转换为赋值运算符吗

转载 作者:太空狗 更新时间:2023-10-29 20:33:04 25 4
gpt4 key购买 nike

我正在实现一个类型 (TParameter),它应该是 bool 值(以指示该值是否有效)和任意类型的数据值。

这个想法是,如果一个方法采用某种类型的参数,那么我可以将它设置为 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() 中的最后一行无法编译。

是否可以告诉编译器TParameter& operator= (bool valid) 仅在参数为bool 时才使用(即禁用隐式转换为 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;
}

LIVE

顺便说一句:在您的代码中,隐式转换发生在 operator= 被调用时; int 转换为 int16_t,然后传递给 operator=。在上面的代码中,隐式转换发生在 operator= 内部,即 m_value = value;

关于c++ - 我可以防止参数隐式转换为赋值运算符吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475595/

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