这是我自己的代码中的一个示例。正如您可能从其中一个结构名称中猜到的那样,这是基于Substitution Failure is Not an Error的原则。该结构has_member_setOrigin
定义了两个版本的test
. U
如果没有会员,第一个不能满足setOrigin
。由于这不是模板替换中的错误,因此它就像它不存在一样。因此,多态函数的解析顺序test(...)
会找到优先级较低的函数。然后value
由 的返回类型确定test
。
接下来是使用模板的callSetOrigin
(相当于你的)的两个定义。如果您检查,您会发现如果第一个模板参数为真,则定义,否则不是。这再次在其中一个定义中产生了替换错误,使得只有一个存在。equals
enable_if
enable_if
enable_if<...>::type
callSetOrigin
template <typename V>
struct has_member_setOrigin
{
template <typename U, void (U::*)(const Location &)> struct SFINAE {};
template <typename U> static char test(SFINAE<U, &U::setOrigin>*);
template <typename U> static int test(...);
static const bool value = sizeof(test<V>(0)) == sizeof(char);
};
template<typename V>
void callSetOrigin(typename enable_if <has_member_setOrigin<V>::value, V>::type &p, const Location &loc) const
{
p.setOrigin(loc);
}
template<typename V>
void callSetOrigin(typename enable_if <!has_member_setOrigin<V>::value, V>::type &p, const Location &loc) const
{
}
忘了我也提供了一个定义enable_if
:
#ifndef __ENABLE_IF_
#define __ENABLE_IF_
template<bool _Cond, typename _Tp>
struct enable_if
{ };
template<typename _Tp>
struct enable_if<true, _Tp>
{ typedef _Tp type; };
#endif /* __ENABLE_IF_ */