你能否使用关键字explicit来防止方法参数的自动转换?

我知道你可以使用C ++关键字“explicit”作为类的构造函数,以防止types的自动转换。 你可以使用这个相同的命令来防止类方法的参数转换吗?

我有两个类成员,其中一个将bool作为参数,另一个是unsigned int。 当我用int调用函数时,编译器把param转换成了一个bool,并调用了错误的方法。 我知道最终我会取代布尔,但现在不想打破其他例程,因为这个新的程序开发。

不,你不能使用明确的,但你可以这样做:

class ClassThatOnlyTakesBoolsAndUIntsAsArguments { public: void Method(bool arg1); void Method(unsigned int arg1); // Below just an example showing how to do the same thing with more arguments void MethodWithMoreParms(bool arg1, SomeType& arg2); void MethodWithMoreParms(unsigned int arg1, SomeType& arg2); private: template<typename T> void Method(T arg1); // Below just an example showing how to do the same thing with more arguments template<typename T> void MethodWithMoreParms(T arg1, SomeType& arg2); }; 

对于采用boolunsigned int每个方法重复此模式。 不要为方法的模板化版本提供实现。

这将强制用户总是显式调用bool或unsigned int版本。

任何尝试使用除boolunsigned int以外的types调用Method都将无法编译,因为该成员是私有的,当然受到可见性规则的标准例外(朋友,内部调用等)的影响。 如果某个具有访问权限的对象调用私有方法,则会出现链接器错误。

explicit阻止特定类之间的自动转换,而不考虑上下文。 当然,你不能为内置的类。

以下是一个非常基本的包装,可以用来创build一个强大的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 } 

这种方法的一个很好的特点是,你也可以区分相同types的不同参数。 例如,你可以有以下几点:

 class WidthTag; typedef StrongType<int, WidthTag> Width; class HeightTag; typedef StrongType<int, HeightTag> Height; void foo (Width width, Height height); 

“foo”的客户会清楚哪个参数是哪个。

一些可能适合你的东西是使用模板。 下面显示了模板函数foo<>()专用于boolunsigned intintmain()函数显示如何parsing调用。 请注意,使用不指定types后缀的常量int的调用将parsing为foo<int>() ,因此如果不专门研究int则会出现调用foo( 1)的错误。 如果是这种情况,使用文字整数常量的调用者将不得不使用"U"后缀来调用parsing(这可能是你想要的行为)。

否则,你必须专注于int并使用"U"后缀或将其转换为unsigned int然后再将其传递给unsigned int版本(或者可以断言该值不是负数,如果这就是你想)。

 #include <stdio.h> template <typename T> void foo( T); template <> void foo<bool>( bool x) { printf( "foo( bool)\n"); } template <> void foo<unsigned int>( unsigned int x) { printf( "foo( unsigned int)\n"); } template <> void foo<int>( int x) { printf( "foo( int)\n"); } int main () { foo( true); foo( false); foo( static_cast<unsigned int>( 0)); foo( 0U); foo( 1U); foo( 2U); foo( 0); foo( 1); foo( 2); } 

编译器给出了“模糊调用”警告,这将是足够的。

我正在做TDD开发,并没有意识到我忘了在模拟对象中实现相应的调用。

bool是一个int,它被限制为0或者1.这就是return 0的整体概念,它在逻辑上和return false一样(不要在代码中使用这个)。

你也可以编写一个调用bool的int版本。