您可以使用关键字显式来阻止方法参数的自动转换吗?

Sup*_*ock 52 c++ explicit implicit-conversion

我知道你可以使用C++关键字'explicit'作为类的构造函数来防止类型的自动转换.您是否可以使用相同的命令来阻止类方法的参数转换?

我有两个类成员,一个将bool作为参数,另一个是unsigned int.当我用int调用函数时,编译器将param转换为bool并调用错误的方法.我知道最终我将替换bool,但是现在不想破坏其他例程,因为这个新例程已经开发出来了.

Pat*_*yer 66

不,你不能使用显式,但你可以这样做:

#include <iostream>

struct Thing {
    void Foo(int value) {
        std::cout << "Foo: value" << std::endl;
    }

    template <typename T>
    void Foo(T value) = delete;
};
Run Code Online (Sandbox Code Playgroud)

对于采用delete或的每个方法重复此模式Thing::Foo.不要为方法的模板化版本提供实现.

这将强制用户始终显式调用bool或unsigned int版本.

由于成员是私有的,任何尝试size_t使用非类型boolunsigned int将无法编译的类型的尝试,当然受制于可见性规则的标准例外(朋友,内部调用等).如果具有访问权限的内容调用私有方法,则会出现链接器错误.

  • 是的,它将禁用所有自动转换。根据问题文本,Dan 想要“防止类方法的参数转换”,而这个方法满足了这一点。有一些方法可以使用模板特化,如果需要,我们可以将基本类型“映射”到特定方法。 (3认同)

Lev*_*Lev 14

否则会explicit阻止特定类之间的自动转换,而与上下文无关.当然,你无法为内置类做到这一点.


Ric*_*den 7

以下是一个非常基本的包装器,可用于创建一个强大的typedef:

template <typename V, class D> 
class StrongType
{
public:
  inline explicit StrongType(V const &v)
  : m_v(v)
  {}

  inline operator V () const
  {
    return m_v;
  }

private:
  V m_v; // use V as "inner" type
};

class Tag1;
typedef StrongType<int, Tag1> Tag1Type;


void b1 (Tag1Type);

void b2 (int i)
{
  b1 (Tag1Type (i));
  b1 (i);                // Error
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一个很好的特点是,您还可以区分具有相同类型的不同参数.例如,您可以拥有以下内容:

class WidthTag;
typedef StrongType<int, WidthTag> Width;  
class HeightTag;
typedef StrongType<int, HeightTag> Height;  

void foo (Width width, Height height);
Run Code Online (Sandbox Code Playgroud)

"foo"的客户会清楚哪个参数是哪个.