c++ - 如何编写可以获取 QString 或 std::string 的子字符串的模板函数?

标签 c++ qt templates stdstring qstring

我想编写一个模板函数来处理 QStringstd::string 以减少复制的代码。不幸的是,QString 没有实现substr 成员函数。 QString::mid(int, int) 似乎是 Qt 的类似物。处理这种差异的最佳方法是什么?下面是我应该作用于 std::string-like 对象的函数:

模板函数:

template <typename StringType>
void do_something(StringType s, StringType::size_type start, StringType::size_type length) {
    // Not defined if StringType == QString
    StringType sub_s = s.substr(start, length);

    // Do something with the substring, for instance:
    std::cout << "Length of substring is " << sub_s.length() << std::endl;
}

我的猜测是,我需要创建另一个函数 get_substr,它是为 std::stringQString 定义的,我可以调用 do_something,但我不确定这是否是理想的解决方案。

最佳答案

std::stringQString 都有data()size() 成员,所以你可以构造一个 std::basic_string_view对于统一的字符串操作:

#include <iostream>
#include <string_view>

template <typename StringType>
void do_something( StringType const& s, typename StringType::size_type start, typename StringType::size_type length ) 
{   
    std::basic_string_view sv( s.data(), s.size() );

    auto sub_s = sv.substr( start, length );

    // Do something with the substring, for instance:
    std::cout << "Length of substring is " << sub_s.length() << std::endl;
}

Live Demo

关于c++ - 如何编写可以获取 QString 或 std::string 的子字符串的模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53992090/

相关文章:

python - matplotlib 不导入 PyQt4、PyQt5 或 PySide

c++ - 在 C++ 控制台窗口中显示表格

c++ - 如何解决CLion上的此编译错误?

c++ - 对字符串数组进行自定义排序

java - Swagger - 自定义由codegen生成的单个类

c++ - 如何处理 C++ 内联 + 模板上下文中的警告?

c++ - 命名空间内的模板特化

支持时间运算的C++标准库

c++ - 使用 gdb 在 Qt Creator 中调试时如何避免输入库的源文件?

c++ - QMetaObject 的 QT 单元测试 moc "unresolved external symbol"