c++ - 如何确定迭代器在c ++模板函数中指向的对象的类型?
问题描述
我在 C++ 中有一个模板函数,可以序列化一个可迭代的:
template<typename Stream, typename Iter, typename Infix, typename Closure>
inline Stream &stream_iterable(Stream &os, Iter from, Iter to, Infix infix_, Closure open, Closure close) {
if (from == to) return os;
os << open << *from;
for (++from; from != to; ++from) {
os << infix_ << *from;
}
os << close;
return os;
}
例如,它基本上转换std::vector<int>{1,2}
为字符串"[1,2]"
我想检查迭代器指向的对象的类型,如果是std::string
,我想使用std::quoted
在向量的元素周围添加引号,像这样:
template<typename Stream, typename Iter, typename Infix, typename Closure>
inline Stream &steam_iterable_quoted(Stream &os, Iter from, Iter to, Infix infix_, Closure open, Closure close) {
if (from == to) return os;
os << open << std::quoted(*from);
for (++from; from != to; ++from) {
os << infix_ << std::quoted(*from);
}
os << close;
return os;
}
如何检查 (*from) 的类型并将这两个函数合二为一?
解决方案
您实际上不需要知道stream_iterable
. 就像老话说的那样,添加一个间接级别:
namespace detail {
template<typename T>
constexpr T const& prepare_to_print(T const& t) { return t; }
auto prepare_to_print(std::string const s&) { return std::quoted(s); }
// A non-const overload would be required as well...
// Forwarding can be a drag sometimes
}
只需将取消引用的迭代器传递给prepare_to_print
. 重载的好处是您可以通过稍后添加更多来进一步自定义行为。
推荐阅读
- bash - 终端提示 macOS 前的奇怪数字和字母组合
- java - 同步变量应该是什么?
- r - 自 macOS 上的新 R 更新以来私下下载的 R 包
- reactjs - Redux 商店没有同步更新?
- jenkins - 管道脚本 - 为网格启动了 docker compose,但它没有进入下一步
- php - Vagrant - 安装作曲家库失败
- python - 在 Cartopy 中查看北极的阿拉斯加/东西伯利亚一侧
- npm - 为包括 anaconda、atom、node.js 等的多语言项目包编写设置脚本的最佳方法?
- ios - 使用多个框架时,如何在不“重复”我的“Podfile”中添加用于测试的 pod?
- c++ - 如何使用 std::generate 初始化具有值的 constexpr 数组