标题引自此SO answer。它正在讨论使用SFINAE来检测具有给定签名的成员函数的存在,并在处理继承的成员函数时指出接受的答案中的方法失败。特别是,给出的解释如下模板实例化不会“继承”
如果你不是已经明白这个问题,那么看看头文件中
std::shared_ptr<T>
的定义就会显示出来。在那个实现中,std::shared_ptr<T>
是从它继承的基类派生的operator*() const
。因此,构成“找到”U = std::shared_ptr<T>
的运算符的模板实例化SFINAE<U, &U::operator*>
将不会发生,因为std::shared_ptr<T>
本身没有operator*()
,并且模板实例化不会“继承”。使用“sizeof()技巧”,仅仅检测T是否具有某些成员函数mf(请参阅此答案和注释),这一障碍不会影响众所周知的SFINAE方法。
使用从答案的术语,是用什么作为T::mf
模板参数来实例化一个类型VS编译器来确定它通过一个函数模板参数推导的区别? “模板实例化不会继承”是什么意思?最后,为什么不影响检查是否存在成员,如here?