首页 > 解决方案 > 我可以防止参数中的隐式转换为赋值运算符吗

问题描述

我正在实现一个类型 ( 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)?

标签: c++templatesimplicit-conversion

解决方案


您可以制作第一个重载模板,然后只有在传递 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;.


推荐阅读