【发布时间】:2018-05-07 10:29:48
【问题描述】:
这个问题的灵感来自标准[class.mem]中的注释
非静态成员函数的类型是普通函数类型,非静态数据成员的类型是普通对象类型。没有特殊的成员函数类型或数据成员类型。
所以,我决定测试一下
struct S
{
using Fn = void();
Fn foo;
static_assert(std::is_same_v<decltype(foo), Fn>);
};
但在decltype(foo) 出现错误:非静态成员函数的使用无效。
如何获取成员函数的类型?还是那张纸条是假的?
注意:对数据成员这样做是有效的
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...);
};
标准中的注释与此无关。
【问题讨论】:
-
你只是没有,看起来。相关:stackoverflow.com/questions/47263793/…
-
如果我们不能
decltypemember_function,我想知道这个注释的目的是什么。 -
@geza 正是我的想法
-
@StoryTeller 我记得。我想知道是否有可能获得该类型。
-
您可以使用
static_assert(std::is_same_v<decltype(&S::foo), Fn S::*>);来检查非静态成员的类型,但我不确定这是否是您的问题。
标签: c++ language-lawyer