【问题标题】:Overloading a method on default arguments在默认参数上重载方法
【发布时间】:2009-04-16 06:52:45
【问题描述】:

是否可以在默认参数上重载方法?

例如,如果我有一个 split() 方法来拆分字符串,但该字符串有两个分隔符,比如“_”和“delimit”。我可以有两种方法吗:

split(const char *str, char delim = ' ')

和

split(const char *str, const char* delim = "delimit");

或者,有没有更好的方法来实现这一点?不知何故,我的大脑现在不工作,想不出任何其他解决方案。

编辑:详细问题:

我有一个带有两个分隔符的字符串,例如 nativeProbableCause_Complete|Alarm|Text。我需要将 nativeProbableCause 和 Complete|Alarm|Text 分开,然后进一步,我需要将 Complete|Alarm|Text 分成单个单词,并在稍后将它们用空格作为分隔符连接起来(为此我已经编写了一个实用程序并且不是没什么大不了的)。困扰我的只是分隔字符串的分隔。

【问题讨论】:

    标签: c++ string delimiter


    【解决方案1】:

    不,你不能——如果你仔细想想,默认的概念意味着“除非我另有说明,否则使用它”。如果编译器有 2 个默认选项,它会选择哪一个?

    【讨论】:

      【解决方案2】:

      如何实现 2 种不同的方法,例如

      • split_with_default_delimiter_space
      • split_with_default_delimiter_delimit

      我个人更喜欢使用这样的东西(更易读..意图传达)而不是你提到的重载类型......即使编译器有可能这样做。

      【讨论】:

        【解决方案3】:

        为什么不直接调用 split() 两次并在第二次显式传递分隔符?分隔符是否总是单个字符?

        在加入第二组单词之前,您是否对它们进行了任何其他处理?如果不是,那么对于第二个任务,您真正想要做的是替换子字符串。使用 std::string::find 和 std::string::replace 最容易做到这一点。如果你必须使用 c-strings,你可以使用 strstr/strchr/strpbrk、strcpy 和 strcat,或者只使用 strstr/strchr/strpbrk 并加入它们。

        【讨论】:

          【解决方案4】:

          您可以使用接受可变数量分隔符的 split 版本(split(const char*,vector<string>),如果您想使用split(const char*, const char**))或只使用Boost Tokenizer。

          【讨论】:

          • 我不能在项目中使用 boost ......这是最糟糕的部分。 :(
          猜你喜欢
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          相关资源
          最近更新 更多