std中的模板类型是is_member_function_pointer

时间:2017-05-15 03:47:29

标签: c++ c++11 c++14

我指的是std::is_member_function_pointer here的可能实现。

template< class T >
struct is_member_function_pointer_helper : std::false_type {};

template< class T, class U>
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {};

template< class T >
struct is_member_function_pointer : is_member_function_pointer_helper< std::remove_cv_t<T> >     


#include <type_traits>

class A {
public:
    void member() { }
};



int main()
{
    // fails at compile time if A::member is a data member and not a function
    static_assert(std::is_member_function_pointer<decltype(&A::member)>::value,
                  "A::member is not a member function."); 
}

我知道

  

“dectype(安培; A ::构件)”

将是

  

“void(A :: *)()”

但我不明白什么类型的T和U型映射到“void(A :: *)()”?

3 个答案:

答案 0 :(得分:6)

模式T U::*分解为UATvoid ()struct A {}; using T = void (); using U = A; template <typename> struct print; int main() { print<T U::*>{}; // error: implicit instantiation of undefined template 'print<void (A::*)()>' } 。 您可以反向查看构造,如下所示:

T

因此void ()std::is_function传递给T,确定给定类型是否为函数类型。

在指向数据成员的指针的情况下,这会失败,因为推导的{{1}}将是非函数类型。

答案 1 :(得分:4)

template< class T, class U>
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {};

如果可以将主模板参数分解为类类型 U和非静态成员类型 T类类型 U在这里不再有用,因为我们已经确认,它确实是一个类。

然后将非静态成员类型 T作为模板参数传递给std::is_functionT在确定T时有很多机制确实是一种功能。

  

但我不明白U中的void (A::*)()类型和void (A::*)()的地图类型?

如上所述,一旦我们能够将T U::*分解为匹配A::*,您就会发现U::*映射到void ()。让我们删除该模式,我们留下T CharAdapter

答案 2 :(得分:2)

如果我们首先将type-id翻译成英语,我认为这更容易理解。也就是说,void (A::*)()被转换为&#34;指向函数类型A的成员的指针,返回void&#34;和T U::*到&#34;指向类U&#34;的类T成员的指针。现在,如果我们比较两种类型,我们可以看到U对应于类AT对应于&#34;函数()返回void&#34; ,即void()