我正在研究内省技术,并想实现一个特征来判断成员函数是否是
static
。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++20 概念,如果您知道函数的名称,您至少可以检查成员是否是静态的:
template<typename ClassT>
concept HasStaticMemberFunction = requires { ClassT::Function();};
template<typename ClassT>
concept HasNonStaticMemberFunction = requires(ClassT& object) { object.Function();};
如果存在“Function”成员函数,无论是静态还是非静态,都将被满足。如果我们谈论函数指针,那么事情就会变得更加困难。我认为根本没有任何方法可以区分静态成员和自由函数之间的函数指针;你能做的最好的事情就是将函数指针的创建包装在某种处理它的宏中。但我们需要了解您的实际用例才能提出进一步的建议。