奇怪的指向成员函数语法的指针

时间:2016-01-27 17:12:40

标签: c++ function-pointers member-function-pointers

我理解如何声明函数的类型:

typedef void (typedef_void_f)(); // typedef_void_f is void()
using alias_void_f     = void(); // alias_void_f is void()

它可用于声明函数指针:

void function() { std::cout << __PRETTY_FUNCTION__ << '\n'; }

typedef_void_f *a = function; // pointer to void()
alias_void_f   *b = function; // pointer to void()

对于成员函数指针,语法稍微复杂一些:

struct S { void function() { std::cout << __PRETTY_FUNCTION__ << '\n'; } };

typedef void (S::*typedef_void_m_f)();
using  alias_void_m_f = void (S::*)();

typedef_void_m_f c = &S::function; // pointer to S void() member function
alias_void_m_f   d = &S::function; // pointer to S void() member function

这是我对C ++中函数指针的理解,我认为这已经足够了。

但在p0172r0 technical paper中,我发现了一种我不熟悉的语法:

struct host {
   int function() const;
};

template <typename TYPE>
constexpr bool test(TYPE host::*) { // <---- What is this??
    return is_same_v<TYPE, int() const>;
}

constexpr auto member = &host::function;

test(member);

据我了解代码,test函数从函数所属对象的类型中分割函数的类型,因此在模板test函数中TYPE模板参数为void(),但如果我尝试以下操作:

void my_test(void() S::*) {}

my_test(&S::function);

我收到一堆语法错误:

error: variable or field 'my_test' declared void
 void my_test(void() S::*) {}
                   ^
error: expected ')' before 'S'
 void my_test(void() S::*) {}
                     ^
error: 'my_test' was not declared in this scope
     my_test(&S::function);

很明显,我不理解p0172r0的test函数语法。

有人可以解释template <typename TYPE> constexpr bool test(TYPE host::*)语法的详细信息吗?

2 个答案:

答案 0 :(得分:3)

TYPE host::*是指向类数据成员的指针。 TYPE是类成员的类型,host::*表示指向host成员的指针。因此TYPE host::*接受指向host

的任何成员的指针

答案 1 :(得分:1)

请改为尝试:

constexpr void my_test(void (S::*)()) {}

这是声明参数类型指针的正确方法,该指针指向S的成员函数返回void而没有参数。

http://ideone.com/EqfYmb