c++多个接口到同一个功能模板

c++ multiple interfaces to the same functionality template

本文关键字:功能 同一个 接口 c++      更新时间:2023-10-16

我有几个方法可以处理utf8编码的字符串,这些字符串通常保存在std::string中。

在同样的情况下,尽管我只是对数据使用constchar*,或者数据是更大字符串的一部分,但我不想创建子字符串。

所有的功能都可以归结为一种通用方法,比如:

void foo(int a, int b, const char* beginStr, const char* endStr);

现在,如果我想避免一些丑陋,我会创建

void foo(int a, int b, const char* beginStr, const char* endStr);
void foo(int a, int b, const char* str);
void foo(int a, int b, const std::string% str);

在某些情况下甚至:

void foo(int a, int b, const std::string::const_iterator& beginStr
                       const std::string::const_iterator& endStr);

这看起来还可以,但正如我提到的,我有几种方法,保持所有这些味道真的很烦人。

我正在寻找的是一些魔术,可以消除对每个接口相乘的需要。c++11的一些功能能在不影响性能的情况下帮助解决这个问题吗?

如注释中所述,作为basic_string_view的包装器可以解决零件
可变模板可以解决其他部分(不要显式使用basic_string_view):

void foo_impl(int a, int b, const basic_string_view& str); // the real implementation
template <typename ... Ts>
void foo(int a, int b, Ts&&... args) {
    foo_impl(a, b, basic_string_view{std::forward(args...)});
}

(删除了我之前的两个答案,希望第三次是魅力所在。)

这只是Jarod42的解决方案,但不依赖于basic_string_view

struct dispatcher {
  dispatcher(const char* begin, const char* end) : begin(begin), end(end) {}
  dispatcher(const char* str) : begin(str), end(str+strlen(str)) {}
  dispatcher(const std::string& str) : begin(&*(str.begin())), end(&*(str.end())) {}
  const char* begin;
  const char* end;
};
struct main_class {
  void foo(int a, int b, const char* begin, const char* end) {
    // implementation here
  }
  template<typename... Ts>
    void foo(int a, int b, Ts&&... args) {
      dispatcher d(std::forward<Ts>(args)...);
      foo(a, b, d.begin, d.end);
    }
};