【发布时间】:2011-03-23 11:37:13
【问题描述】:
是否有人知道根据是否定义了非成员方法来专门化模板的方法?我知道如果存在成员函数,有很多方法可以专门化,但我从未见过非成员示例。具体问题是,如果为 T 定义了 operator
template <typename T>
typename enable_if< ??? ,std::ostream &>::type operator<<( std::ostream & os, const shared_ptr<T> & ptr )
{
if(ptr)
return os << *ptr;
else
return os << "<NULL>";
}
template <typename T>
typename disable_if< ??? ,std::ostream &>::type operator<<( std::ostream & os, const shared_ptr<T> & ptr )
{
if(ptr)
return os << static_cast<intptr_t>( ptr.get() );
else
return os << "<NULL>";
}
编辑:对于后代,这是可行的解决方案。注意 boost::shared_ptr 已经有一个默认的 operator
template <typename T>
typename boost::enable_if_c< boost::is_reference<decltype(*static_cast<std::ostream *>(0) << *static_cast<T *>(0) )>::value, std::ostream &>::type operator<<( std::ostream & os, const boost::shared_ptr<T> & ptr )
{
if(ptr)
return os << *ptr;
else
return os << "<NULL>";
}
【问题讨论】:
-
This solution 可能对您有所帮助。这是解决问题的不同方法,但结果相同。如果未定义运算符,它将转到通用输出函数,您可以在其中做任何您想做的事情。不作为答案发布,因为它没有回答标题问题,但我推荐这个。
-
您很少会发现将流插入和提取运算符实现为成员函数的类,因为需要作为左操作数的是 stream,而不是类.
-
好电话 Rob。我没想到这一点。
-
只想说,我认为您不需要任何 enable_if 东西。我认为它只适用于 decltype。
-
DeadMG,在这种情况下你肯定是对的,但我认为这是我们想要有条件地实例化的函数(operator)和我们正在使用的函数的幸运结果查询具有相同返回值的 (operator