我知道你可以使用C++关键字'explicit'作为类的构造函数来防止类型的自动转换.您是否可以使用相同的命令来阻止类方法的参数转换?
我有两个类成员,一个将bool作为参数,另一个是unsigned int.当我用int调用函数时,编译器将param转换为bool并调用错误的方法.我知道最终我将替换bool,但是现在不想破坏其他例程,因为这个新例程已经开发出来了.
不,你不能使用显式,但你可以这样做:
#includestruct Thing { void Foo(int value) { std::cout << "Foo: value" << std::endl; } template void Foo(T value) = delete; };
对于采用delete
或的每个方法重复此模式Thing::Foo
.不要为方法的模板化版本提供实现.
这将强制用户始终显式调用bool或unsigned int版本.
由于成员是私有的,任何尝试size_t
使用非类型bool
或unsigned int
将无法编译的类型的尝试,当然受制于可见性规则的标准例外(朋友,内部调用等).如果具有访问权限的内容调用私有方法,则会出现链接器错误.
否则会explicit
阻止特定类之间的自动转换,而与上下文无关.当然,你无法为内置类做到这一点.
以下是一个非常基本的包装器,可用于创建一个强大的typedef:
templateclass 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 Tag1Type; void b1 (Tag1Type); void b2 (int i) { b1 (Tag1Type (i)); b1 (i); // Error }
这种方法的一个很好的特点是,您还可以区分具有相同类型的不同参数.例如,您可以拥有以下内容:
class WidthTag; typedef StrongTypeWidth; class HeightTag; typedef StrongType Height; void foo (Width width, Height height);
"foo"的客户会清楚哪个参数是哪个.