SFINAE 在 decltype 中使用范围解析运算符
SFINAE using scope resolution operator in decltype
问题 How does `void_t` work 显示了在 class 数据成员 T::member
上使用 void_t 的 SFINAE 示例。但是,如果 member
是一个函数,它就不起作用。为什么会这样 ?如果我将代码从 decltype( T::member )
更改为 decltype( T().member() )
.
#include <iostream>
using namespace std;
template< class ... > using void_t = void;
template< class , class = void >
struct has_member : std::false_type
{ };
template< class T >
struct has_member< T , void_t< decltype( T::member ) > > : std::true_type
{ };
struct A {
void member();
};
int main()
{
static_assert( has_member< A >::value , "A" ); // assertion fails
return 0;
}
decltype( T::member )
不起作用,因为当 member
引用非静态成员函数时,T::member
不是 decltype
期望的有效表达式。
您可以改为 decltype( &T::member )
。 &T::member
returns 指向成员的指针,它适用于成员函数和数据成员,static
或非static
.
顺便说一句:Why is “using namespace std;” considered bad practice?
问题 How does `void_t` work 显示了在 class 数据成员 T::member
上使用 void_t 的 SFINAE 示例。但是,如果 member
是一个函数,它就不起作用。为什么会这样 ?如果我将代码从 decltype( T::member )
更改为 decltype( T().member() )
.
#include <iostream>
using namespace std;
template< class ... > using void_t = void;
template< class , class = void >
struct has_member : std::false_type
{ };
template< class T >
struct has_member< T , void_t< decltype( T::member ) > > : std::true_type
{ };
struct A {
void member();
};
int main()
{
static_assert( has_member< A >::value , "A" ); // assertion fails
return 0;
}
decltype( T::member )
不起作用,因为当 member
引用非静态成员函数时,T::member
不是 decltype
期望的有效表达式。
您可以改为 decltype( &T::member )
。 &T::member
returns 指向成员的指针,它适用于成员函数和数据成员,static
或非static
.
顺便说一句:Why is “using namespace std;” considered bad practice?