在this帖子,建议使用以下方法来定义 operator<<
定义 dump()
的所有类的函数成员函数:
template <typename T, typename charT>
auto operator<< (std::basic_ostream<charT> & str, const T & t) -> decltype(t.dump(str))
{
return t.dump(str);
}
为什么这个函数模板不能捕获所有类型,包括那些没有定义 dump
的类型成员函数?我的意思是,选择重载时是否考虑了函数签名的返回类型部分?
最佳答案
返回类型本身并不重要。所提议的技术依赖于 SFINAE(替换失败不是错误),以便在声明对于实例化无效时删除重载。也就是说,当编译器尝试实例化上面的 operator<<()
时类型 T
没有可访问的 dump(str)
成员(member), decltype(t.dump(str))
将无效。它没有失败,而是决定此重载不起作用并将其从候选重载集中删除。
一旦收集到候选项,过载决议就会选择最佳选项。如果最佳选项是唯一的,则选择它来调用。如果没有拟合选项或有多个最佳匹配,则会出错。
关于c++ - 函数返回类型会影响重载的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179297/