检查静态成员函数

问题描述 投票:0回答:1

我正在研究内省技术,并想实现一个特征来判断成员函数是否是

static

经过一番阅读(socppreference)后,我明白指向
static
成员函数的指针的类型与具有相同签名的指向自由函数的指针的类型完全相同。

因此我不能:

  • 判断成员函数是否为
    static
    ;
  • 从指向
    static
    成员函数的指针检索类;
  • 告诉一个类是否有给定的
    static
    成员函数(我看到了这个问题,但我不确定它是否是相同的目标,并且答案依赖于我无法使用的
    std::experimental
    )。

真的没有办法吗? (我认为至少对于前两个破折号来说没有;对于第三个破折号,我不太确定)

[编辑]一些片段会更清楚:

struct S {
    static int foo(int);
} template <typename Fun>
Process(Fun fun) {
    std::cout << PrettyTypePrinting<is_member_of_t<FunPtr>>::Disp() << '\n';
}
int main() {
    // tell if the input is a static member function
    std::cout << std::boolalpha << is_static_member_v<decltype(S::foo)> << '\n';
    // tell if the input has a given static member function
    std::cout << std::boolalpha << has_static_foo_v<S> << '\n';
    // retrieve the class from a member function
    Process(S::foo);
}

期待:

真实 真的 结构体S

这是我的伪代码,希望它能让目标更清晰。

此外,如果有办法做到这一点,我希望看到针对不同语言标准的不同解决方案,从 C++14 开始。

谢谢

c++ static-methods type-traits introspection
1个回答
0
投票

使用 c++20 概念,如果您知道函数的名称,您至少可以检查成员是否是静态的:

template<typename ClassT>
concept HasStaticMemberFunction = requires { ClassT::Function();};
template<typename ClassT>
concept HasNonStaticMemberFunction = requires(ClassT& object) { object.Function();};

如果存在“Function”成员函数,无论是静态还是非静态,都将被满足。如果我们谈论函数指针,那么事情就会变得更加困难。我认为根本没有任何方法可以区分静态成员和自由函数之间的函数指针;你能做的最好的事情就是将函数指针的创建包装在某种处理它的宏中。但我们需要了解您的实际用例才能提出进一步的建议。

© www.soinside.com 2019 - 2024. All rights reserved.