函数/方法重载C++:数据类型混乱?

Tom*_*Tom 9 c++ methods types overloading function

我在使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

Method("string");
Run Code Online (Sandbox Code Playgroud)

它在呼唤:

Method(bool paramater);
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 23

订单没有区别.通过分析参数的类型并将它们与参数类型相匹配来选择要调用的方法.如果没有完全匹配,则选择最佳匹配方法.在你的情况下,它恰好是bool方法.

您正在提供类型的参数const char[7].根据C++重载规则,这里最好的路径是让它const char[7]衰减const char *然后转换为bool使用标准转换.与转换的路径std::string被认为是差,因为它会涉及从用户定义转换const char *std::string.通常,用户定义的转换会丢失标准转换的重载解析过程.这也是你的情况.

如果您需要std::string在此处const char *调用std::string版本,请为type 提供显式重载,并通过将参数转换为std::string显式类型来将调用委托给version

void Method(const char *paramater /* sic! */)
{
  Method(std::string(paramater));
}
Run Code Online (Sandbox Code Playgroud)


CB *_*ley 5

字符串文字"string"具有const char[]可以被隐含转换为的类型bool.这是您的一个重载函数的最佳转换候选者,尽管它不太可能是最有用的函数.

如果您的意图是通过重载来处理字符串文字std::string,那么您需要添加一个重载const char*,并使实现调用该std::string版本.