gpt4 book ai didi

templates - 用于模板化重载的不明确运算符<<

转载 作者:行者123 更新时间:2023-12-02 22:40:48 24 4
gpt4 key购买 nike

以下代码是我第一次使用 C++11 尝试漂亮地打印可迭代容器。它使用了函数模板默认参数功能。

#include <ostream>
#include <string>
#include <utility>

template <typename T>
void print(std::ostream &o, T const &t) { o<< t; }

void print(std::ostream &o, std::string const &s){ o<< '"'<< s<< '"'; }

template <typename K, typename V>
void print(std::ostream &o, std::pair<K, V> const &p)
{
o<< '{'; print(o, p.first);
o<< ": "; print(o, p.second);
o<< '}';
}

template <typename C, typename I= typename C::const_iterator>
std::ostream &operator<< (std::ostream &o, C const &c)
{
o<< '[';
if(c.empty()) return o<< ']';
I b= c.begin(), e= c.end(); -- e;
for(; b!= e; ++ b)
{
print(o, *b);
o<< ", ";
}
print(o, *b);
return o<< ']';
}

它在容器、容器的容器等上运行良好。但有一个异常(exception):

std::cout<< std::string("wtf");

使用 g++4.7/8 编译会中断 ambiguous operator<< .

是否有任何修复此代码以避免歧义?

最佳答案

您可以使用 std::enable_if 在字符串的情况下禁用重载:

template <typename C, typename I= typename C::const_iterator>
typename std::enable_if<!std::is_same<C,std::string>::value,std::ostream>::type &
operator<< (std::ostream &o, C const &c)
{
o<< '[';
if(c.empty()) return o<< ']';
I b= c.begin(), e= c.end(); -- e;
for(; b!= e; ++ b)
{
print(o, *b);
o<< ", ";
}
print(o, *b);
return o<< ']';
}

或者更通用地做到这一点:

template <typename T>
struct is_string : std::false_type {};

template <typename Char,typename Allocator>
struct is_string<std::basic_string<Char,Allocator> > : std::true_type {};

template <typename C, typename I= typename C::const_iterator>
typename std::enable_if<!is_string<C>::value,std::ostream>::type &
operator<< (std::ostream &o, C const &c)
{
o<< '[';
if(c.empty()) return o<< ']';
I b= c.begin(), e= c.end(); -- e;
for(; b!= e; ++ b)
{
print(o, *b);
o<< ", ";
}
print(o, *b);
return o<< ']';
}

关于templates - 用于模板化重载的不明确运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18765701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com