c++多个接口到同一个功能模板
c++ multiple interfaces to the same functionality template
我有几个方法可以处理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);
}
};
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 为什么std::async使用同一个线程运行函数
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 如何在同一个模板功能上专门化几种类型?
- c++多个接口到同一个功能模板