设计函数模板以处理字符串/ char参数的最佳实践是什么?

sta*_*low 5 c++ c++17

我想写一个简单的字符串split函数.

该函数应该采用一个std::basic_string和一个分隔符(可能是一个CharTstd::basic_string),并将结果放入一个ContainerT.

我的第一次尝试是

template <typename StringT, typename DelimiterT, typename ContainerT>
void split(
    const StringT &str, const DelimiterT &delimiters, ContainerT &conts) {
    conts.clear();
    std::size_t start = 0, end;
    std::size_t len = delimiters.size();
    while ((end = str.find(delimiters, start)) != StringT::npos) {
        if (end - start) {
            conts.emplace_back(str, start, end - start);
        }
        start = end + len;
    }

    if (start != StringT::npos && start < str.size()) {
        conts.emplace_back(str, start, str.size() - start);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的最终目标是扩展此功能以实现:

  1. 最终的结果总是std::basic_string<CharT>放在一些conts.
  2. 第一个参数str可以是std::basic_string<CharT>,const CharT*或字符串文字.
  3. 第二个参数delimiter可以是一个char,或一个std::basic_string<CharT>/ const CharT*/字符串文字,意味着定界符的长度大于1时,例如,拆分aaa,,bbb,c,,给出aaa/bbb,c.
  4. 第三个参数可以是来自的任何序列容器STL.

由于人们通常使用C++处理现代咒语,因此2可能std::basic_string<CharT>只是为了简化.

鉴于函数(模板)可以重载,我想知道

  1. 在这种情况下,我至少需要多少功能?
  2. 设计此类函数的最佳实践是什么(如何编写更多通用函数)?例如,也许要使上述函数使用const CharT*分隔符,该行std::size_t len = delimiters.size();必须更改为某些std::distance(...)

更新:

此处添加一个重复代码审查.

Sne*_*tel 1

根据输入字符串进行构造basic_string_view,然后对其进行操作。Abasic_string_view有一个显式构造函数,采用 a char*,并且basic_string有一个强制转换运算符 to basic_string_view