#include <iostream>
#include <type_traits>
struct Foo
{
// ### Member Function ###
void bar() { std::cout << "Foo::bar()\n"; }
};
// ### 1 Parameter Primary Template (which is empty) ###
template<typename>
struct Traits {};
// ### 2 Parameter Template Specialization ###
template<class T, class U>
struct Traits<T U::*>
^^^^^^ // I don't understand this syntax
{
using type1 = T;
using type2 = U;
};
int main()
{
// ### Pointer to member function ###
void (Foo::*memFuncPtr)() = &Foo::bar;
Foo f;
// ### Use the member function pointer to invoke it ###
(f.*memFuncPtr)();
static_assert(std::is_same_v<void(), Traits<decltype(&Foo::bar)>::type1>);
static_assert(std::is_same_v<Foo, Traits<decltype(&Foo::bar)>::type2>);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
专业化语法如何工作?Uin与 typeU::*相同是有道理的Foo,但为什么T与 type 相同呢void()?
在 @user17732522 的非常有用的评论和 @AnoopRana 的回答之后,我能够更改main函数实现以使用相同的语法(只是为了看看它是否有效)。
int main()
{
using F = void();
// ### Pointer to member function ###
F Foo::*memFuncPtr = &Foo::bar;
Foo f;
// ### Use the member function pointer to invoke it ###
(f.*memFuncPtr)();
static_assert(std::is_same_v<void(), Traits<decltype(&Foo::bar)>::type1>);
static_assert(std::is_same_v<Foo, Traits<decltype(&Foo::bar)>::type2>);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)struct Trait<T U::*> ^^^^^^ // I don't understand this syntax
上面的语法意味着我们有一个指向名为的类的成员的指针,U其中该成员的类型为T。换句话说,指向类型为 的类成员的指针UT。
现在让我们将其应用到&Foo::bar. 表达式的类型&Foo::bar为:
void (Foo::* f)()
Run Code Online (Sandbox Code Playgroud)
现在您可以将其与T U::*
所以,经过比较我们得到:
U = Foo这是类类型。T = void()void这意味着具有返回类型且不带参数的函数,即函数类型。这实际上意味着我们有一个指向 class 的成员函数的指针,该函数具有返回类型void且不带参数Foo。
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |