mrD*_*son 15 c++ templates stl c++14
您将如何编写一个库,当包含它时,它会使任何*现有STL容器的<<运算符超载?
一个自我强加的要求是它不能包含任何容器的头文件.这将不必要地膨胀最终的可执行文件.在我希望使用的容器之后包含此标头更有意义.这种限制意味着使用templates或macros.
我正在寻找建议和指示,所以,请不要发布能够做到这一点的完全正常工作的代码!自己实现这一点是学习过程的一部分.代码片段的小片段可以展示某些东西是如何工作的.
到目前为止我做了什么:
我<<为每个具有不同模板签名的容器重载了运算符.我遇到的问题是,有些容器具有相同数量的模板参数,但有些容器包含std::pair-s,其他容器single values.更确切地说,这是std::map&std::multimapvs std::unordered_set&的情况std::unordered_multiset.
这次碰撞迫使我要么实现其中一对的非模板版本,要么想出一种区分std::pair-s和-s 的方法single values.不过,我真的不知道如何去做第二个.我之所以不直接" 怎么做 " 的原因是我开始相信这可以通过更好的整体设计来完全避免.
先感谢您!
什么对我有用:
operator<<的std::pairoperator<<使用不同的模板参数重载每个STL容器
注意:
template <typename T1>并且template <typename T1, typename T2>是不同的template <typename T1, typename T2>并且template <typename T1, size_t T2>是 不同的template <typename T1, typename T2>和template <typename C1, typename C2>是不是不同
使用"模板中的模板",例如,函数看起来像:
template <typename Type, template <typename TYPE> class TClass>
void func(TClass<Type>& tc) {
if (tc.somethingTrue())
tc.doStuff();
}
Run Code Online (Sandbox Code Playgroud)
您可以重载operator<<作为带有模板模板参数(即任何容器)的模板。
然后,您可以提供模板函数的两个重载(例如print),其中一个重载专门针对std::pair。
template<typename T>
std::ostream& print(std::ostream &out, T const &val) {
return (out << val << " ");
}
template<typename T1, typename T2>
std::ostream& print(std::ostream &out, std::pair<T1, T2> const &val) {
return (out << "{" << val.first << " " << val.second << "} ");
}
template<template<typename, typename...> class TT, typename... Args>
std::ostream& operator<<(std::ostream &out, TT<Args...> const &cont) {
for(auto&& elem : cont) print(out, elem);
return out;
}
Run Code Online (Sandbox Code Playgroud)
一个非常简单的尝试可以解决此问题,例如:
template<typename T>
void print_container(std::ostream& os, const T& container, const std::string& delimiter)
{
std::copy(std::begin(container),
std::end(container),
std::ostream_iterator<typename T::value_type>(os, delimiter.c_str()));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2615 次 |
| 最近记录: |