当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《您可以使用关键字显式来阻止方法参数的自动转换吗?》经验,为你挑选了3个好方法。

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

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



1> Patrick John..:

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

#include 

struct 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使用非类型boolunsigned int将无法编译的类型的尝试,当然受制于可见性规则的标准例外(朋友,内部调用等).如果具有访问权限的内容调用私有方法,则会出现链接器错误.



2> Lev..:

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



3> Richard Cord..:

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

template  
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 Tag1Type;


void b1 (Tag1Type);

void b2 (int i)
{
  b1 (Tag1Type (i));
  b1 (i);                // Error
}

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

class WidthTag;
typedef StrongType Width;  
class HeightTag;
typedef StrongType Height;  

void foo (Width width, Height height);

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有