【问题标题】:Function/Method Overloading C++: Data type confusion?函数/方法重载 C++:数据类型混淆?
【发布时间】:2010-12-10 19:22:11
【问题描述】:

我在 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);

【问题讨论】:

    标签: c++ function types methods overloading


    【解决方案1】:

    您可以添加一个 explict 关键字以获取预期的参数。

    【讨论】:

      【解决方案2】:

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

      Method("string");
      

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

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

      【讨论】:

      • 不要施放;构造! std::string("string") (或像上面所说的那样对 char* 进行重载)
      【解决方案3】:

      不回答您的问题,但出于好奇,是否有隐藏的原因不使用模板方法而不是为每种类型定义重载版本?

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

      【讨论】:

      • 这很好,因为它会禁用开始变得奇怪的自动转换。您还可以仅针对您打算支持的少数专业化定义您的方法。
      【解决方案4】:

      顺序没有区别。通过分析参数的类型并将它们与参数的类型匹配来选择要调用的方法。如果没有完全匹配,则选择最佳匹配方法。在您的情况下,它恰好是 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));
      }
      

      【讨论】:

      • 未定义 -> 用户定义?
      【解决方案5】:

      除了字符串问题,还有另一个问题。 int64_t 和 int8_t (通常)是类型定义。由于 typedef 只是别名,因此它们可能引用相同的类型,在这种情况下重载将不起作用。但这在您的情况下不太可能。只是想提一下。

      【讨论】:

        【解决方案6】:

        正如查尔斯已经指出的那样,这是由于不需要的隐式转换而发生的。如果您想避免这种情况,请使用 std::string 构造函数: Method(std::string("string")); 或将其转换为 std::string:

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

        但是,声明的顺序并不重要。还要检查你对“参数”这个词的拼写;)

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 这很烦人。该决议规则未能实现如此基本的概念。也许OP“按声明顺序”直观的方法会做得更好。
          猜你喜欢
          • 2017-08-14
          • 2017-12-24
          • 2011-02-01
          • 1970-01-01
          • 2012-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多