繁体   English   中英

你如何获得成员函数的类型

[英]How do you get the type of a member function

该问题的灵感来自标准[class.mem] 中的注释

非静态成员函数的类型为普通函数类型,非静态数据成员的类型为普通对象类型。 没有特殊的成员函数类型或数据成员类型。

所以,我决定测试一下

struct S
{
    using Fn = void();
    Fn foo;

    static_assert(std::is_same_v<decltype(foo), Fn>);
};

但它的错误decltype(foo) : invalid use of non-static member fucntion

你如何获得成员函数的类型? 还是那张纸条只是假的?

注意:对数据成员这样做是有效的

struct U
{
    int i;
    static_assert(std::is_same_v<decltype(i), int>);
};

注2:我不是在寻找如何通过指向成员的指针来获取类型

template<typename>
struct NotLikeThis;
template<typename C, typename R, typename... Args>
struct NotLikeThis<R (C::*)(Args...)>
{
    using type = R(Args...);
};

标准中的注释与此无关。

该标准明确指出您不能这样做。

[expr.prim.id]

2只能使用表示类的非静态数据成员或非静态成员函数的id 表达式

(2.1)作为类成员访问的一部分,其中对象表达式引用成员的类58或从该类派生的类,或

(2.2)形成一个指向成员的指针 ( [expr.unary.op] ),或

(2.3)如果该id 表达式表示一个非静态数据成员并且它出现在一个未计算的操作数中。

[ 示例:

 struct S { int m; }; int i = sizeof(S::m); // OK int j = sizeof(S::m + 42); // OK

— 结束示例 ]

请注意,我强调只能使用:这些是您可以使用表示成员函数的表达式的唯一方法。 你能想出的任何其他方式都是错误的。

请注意,2.3 正是您想要的 - 在未评估的上下文(即: decltype )中使用S::mm是成员函数),但它特别(我会故意假设)仅适用于数据成员。

我可以想到至少一个允许这样做的含义(见下文)。 可能还有更多。

  • 让我们假设m被声明为void m(); 它是S类的成员。 如果decltype(S::m)有效,则std::add_pointer<decltype(S::m)>也应该有效。
    考虑到成员函数具有隐式this参数,这第二种类型是什么? void (S::*)() ,或者像void (*)(S*) 甚至void (*)() 对我们来说,我们想要void (S::*)()可能很明显,但是知道S::m只是一个常规函数类型,为什么add_pointer将它变成一个指向成员的指针? 它怎么可能区分它?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM