功能/方法重载C ++:数据类型混乱?(Function/Method Overloading C+

2019-09-01 21:33发布

我有一些麻烦重载在C ++中的方法。 作为该问题的一个例子,我有过载与一些方法的类,并具有不同的数据类型的一个参数的每个方法。 我的问题:有没有在类特定的顺序这些方法应该出现在,以确保根据其参数的数据类型选择正确的方法被调用?

class SomeClass{
    public:
    ...
    void Method(bool paramater);
    void Method(std::string paramater);
    void Method(uint64_t paramater);
    void Method(int64_t paramater);
    void Method(uint8_t paramater);
    void Method(int8_t paramater);
    void Method(float paramater);
    void Method(double paramater);
    void Method(ClassXYZ paramater);
}

我注意到运行的时候,因为有问题:

Method("string");

它在呼唤:

Method(bool paramater);

Answer 1:

该命令没有什么区别。 通过分析类型的参数,并将它们匹配到类型的参数选择要调用的方法。 如果没有精确匹配,选择最匹配的方法。 在你的情况下,它碰巧是bool方法。

您正在供给类型的参数const char[7] 根据C ++重载规则,在这里的最佳路径是让const char[7]衰减到const char *和然后将其转换到bool使用标准转换。 与转换为路径std::string被认为是糟糕的,因为这将涉及从用户定义类型转换const char *std::string 。 一般情况下,用户定义的转换失去重载解析过程中的标准转换。 这是你的情况下发生的事情为好。

如果你需要std::string版本在这里呼吁,提供了一个明确的过载const char *类型,并委托调用std::string通过转换参数版本std::string类型明确

void Method(const char *paramater /* sic! */)
{
  Method(std::string(paramater));
}


Answer 2:

字符串文字"string"具有类型const char[]可以是含蓄转换成bool 。 这是最好的转换候选,以你的重载函数之一,虽然它不太可能是最有用的一个。

如果你的目的是让字符串字面量由过载采取了处理std::string ,那么你需要添加一个过载走const char* ,使执行调用std::string版本。



Answer 3:

顺序并不重要。 这里的问题是,当你调用

Method("string");

您正在传递一个const char []。 这将被转换为隐式bool的。 你想要做的是明确地传递一个的std :: string:

Method( std::string("string"));


Answer 4:

不回答你的问题,但是,只是出于好奇,是有一个隐藏的理由不使用模板的方法,而不是定义为每种类型的重载版本?

class SomeClass
{
    public:
    ...
    template <typename T>
    void Method(T paramater);
};


Answer 5:

正如查尔斯已经指出,出现这种情况是由于不想要的隐式转换。 如果你想避免这种情况,使用的std :: string构造函数: Method(std::string("string")); 或铸造它的std :: string:

Method(static_cast<std::string>("string"));

然而,您声明的顺序并不重要。 另外,请检查你的单词“参数”的拼法)



Answer 6:

除了字符串的问题,还有一个又一个。 和的int64_t中int8_t(通常)的typedef。 由于类型定义只是别名,它们可能指的是同一类型,其中超载的情况下将无法正常工作。 但是,这是你的情况相当不可能的。 只是想提到它。



Answer 7:

您可以添加一个显式的关键字,以便采取预定的参数。



文章来源: Function/Method Overloading C++: Data type confusion?