gpt4 book ai didi

c++ - SFINAE 检测非成员函数是否存在

转载 作者:太空狗 更新时间:2023-10-29 22:52:56 25 4
gpt4 key购买 nike

有人知道根据是否定义非成员方法来特化模板的方法吗?我知道如果一个成员函数存在,有很多方法可以专门化,但我从未见过非成员函数的例子。具体问题是如果为 T 定义了 operator<< ,则专门为 shared_ptr 应用 operator<< ,否则仅打印指针位置。如果所有的类都将 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<< 输出地址,所以 disable_if 是不必要的。由于 operator<< 返回一个引用,所以这是有效的。对于一般情况,我怀疑必须对其进行调整以反射(reflect)相关函数的返回类型。

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>";
}

最佳答案

如果您使用的是 C++0x,您可以简单地使用 decltype。

template<typename Char, typename CharTraits, typename T>
decltype(
*(std::basic_ostream<Char, CharTraits>*)(nullptr) << *(T*)(nullptr)
)

如果无法输出T,肯定会导致替换失败。您可能可以在 C++03 中做类似的事情,但我不确定如何做。

编辑:刚刚意识到 decltype 表达式实际上并不产生 true 或 false 值并且不会编译。但你明白了。试试这个。

关于c++ - SFINAE 检测非成员函数是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375652/

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