大约一周前,我提出了一个问题,询问如何只有在类型具有特定成员函数时才能简单地实例化类模板。在我的答案中,我得到了一个有点复杂的解决方案。但后来我尝试自己做。我只想知道是否足够确定给定类型 T
是否有一个名为 f
、参数为 0 的 void 函数。
#include <type_traits>
#include <utility>
template <typename T, typename = void>
struct has_f : std::false_type { };
template <typename T>
struct has_f<
T,
decltype(std::declval<T>().f(), void())> : std::true_type { };
template <typename T, typename = typename std::enable_if<has_f<T>::value>::type>
struct A { };
struct B
{
void f();
};
struct C { };
template class A<B>; // compiles
template class A<C>; // error: no type named ‘type’
// in ‘struct std::enable_if<false, void>’
如果是这样,为什么在这个帖子中,其他答案都那么复杂呢?
has_f
本身依赖于 SFINAE,而A
则不依赖。 - Luc Dantonthis
特性,在C++1y中,std::declval<T&>().f()
和std::declval<T>().f()
(或者是std::declval<T&&>().f()
?)可能是不同的东西。 - Yakk - Adam Nevraumont