【发布时间】:2021-12-28 02:22:35
【问题描述】:
我正在用 C++14 开发一个工具类,它允许开发人员轻松打印各种对象。
对于std::map对象,我尝试开发这样一个功能:
template<typename M, typename = std::enable_if_t<
std::is_same<M, std::map<typename M::key_type, typename M::mapped_type>>::value ||
std::is_same<M, std::unordered_map<typename M::key_type, typename M::mapped_type>>::value>>
std::string map2String(const M& mp) {
std::stringstream res;
for (const auto& element : mp) {
res << element.first << "," << element.second << "|";
}
return res.str();
}
它按预期工作。 (顺便说一句,C++11也可以,我可以用C++11的方式替换std::enable_if_t。)
但是,如您所见,std::stringstream 已被使用,这意味着必须对M::key_type 和M::mapped_type 进行流式传输。
但我不知道如何检查它们是否是流式传输的。我需要这样的东西:
std::enable_if_t<is_streamable<typename M::key_type>>::value
但是标准库中没有is_streamable。如果没有is_streamable,是否有任何其他方法可以为那些在调用我的函数时无法写入流的类型产生编译时错误?
【问题讨论】:
标签: c++ templates c++14 stringstream enable-if