是否有合法的方法来使用运算符<<?来打印元组和对?
我有一组模板/函数允许我打印一个元组/对,假设元组/对中的每个类型都为它定义了
operator<<
。不幸的是,由于17.4.3.1,将operator<<
重载添加到std
是违法的。还有另一种让ADL找到我的operator<<
的方法吗?如果没有,在namespace std{}
包裹我的过载是否有任何实际伤害?
感兴趣的人的代码:(我正在使用gcc-4.5)
namespace tuples {
using ::std::tuple;
using ::std::make_tuple;
using ::std::get;
namespace detail {
template< typename...args >
size_t size( tuple<args...> const& )
{
return sizeof...(args);
};
template<size_t N>
struct for_each_ri_impl
{
template<typename Func, typename Tuple>
void operator()(Func func, Tuple const& arg)
{
for_each_ri_impl<N-1>()(func, arg );
func( get<N>( arg ), size(arg) - N - 1 );
}
};
template<>
struct for_each_ri_impl<0>
{
template<typename Func, typename Tuple>
void operator()(Func func, Tuple const& arg)
{
func( get<0>( arg ), size(arg) - 1 );
}
};
}//detail
template<typename Func, typename ... Args>
void for_each_ri( tuple<Args...>const& tup, Func func )
{
detail::for_each_ri_impl< sizeof...(Args)-1>()( func, tup );
}
struct printer {
std::ostream& out;
const std::string& str;
explicit printer( std::ostream& out=std::cout, std::string const& str="," ) : out(out), str(str) { }
template<typename T>void operator()(T const&t, size_t i=-1) const { out<<t; if(i) out<<str; }
};
//Should this next line go into namespace std? Is there another way?
template<typename ... Args>
std::ostream& operator<<(std::ostream& out, std::tuple< Args... > const& tup)
{
out << '[';
tuples::for_each_ri( tup, tuples::printer(out,", ") );
return out << ']';
}
} //tuples
//Edits --
int main()
{
using namespace std;
cout<<make_tuple(1,'a',"Hello")<<endl;
return 0;
}
编制以上产量:
test.cpp:在函数'int main()'中:
test.cpp:69:31:错误:无法将'std :: ostream'左值绑定到'std :: basic_ostream&amp;&amp;' > / opt / local / include / gcc45 / c ++ / ostream:579:5:错误:初始化'std :: basic_ostream&lt; _CharT,_Traits>&amp;的参数1 std :: operator&lt;&lt;(std :: basic_ostream&lt; _CharT,_Traits>&amp;&amp;,const _Tp&amp;)[with _CharT = char,_Traits = std :: char_traits,_Tp = std :: tuple]'
没有找到相关结果
已邀请:
2 个回复
校勒魏寡
这是一个大纲,因为我不确定如何使用可变参数模板来完成它,尽管它应该是可能的。您可以通过1,2,3等参数轻松实现多个版本,例如:
泻伴墓荒
然后项目中的任何内容都可以使用它们。 我仍然不确定为什么这对你不起作用,但似乎你想要这样的东西: