获取静态类功能的类类型

Get the class type of a static class function

本文关键字:类型 功能 静态类 获取      更新时间:2023-10-16

我有一个函数指针指向静态类功能Foo::bar(),并希望获得类的类型(Foo)。现在,我知道如果barFoo的成员函数,而不是静态函数,则可以获得类型,而具有以下类型特征:

template<class T> struct class_of; template<class T, class R> struct class_of<R T::*> { using type = T; };

但是,这对静态功能不起作用。我想做的是以下内容: class_of<Foo::bar>::type == Foo

在我看来,编译器知道所有相关信息,那么如何完成?

裸函数指向静态成员函数的指针是同一类型的作为非成员函数的函数指针。

也许您可以在功能指针周围使用包装器来包含类信息:

#include <iostream>
struct Foo {
  template<class Arg>
  static void bar(Arg arg) {
    std::cout << "called with " << arg << std::endl;
  }
};
template<class T, class Ret, class... Args>
struct Wrapper {
  using F = Ret(*)(Args...);
  F f_;
  constexpr Wrapper(F f) noexcept : f_{f} {}
  template<class... RealArgs>
  constexpr Ret operator()(RealArgs&&... args) const {
    return f_(std::forward<RealArgs>(args)...);
  }
};
template<class T, class Ret, class... Args>
constexpr Wrapper<T, Ret, Args...> make_wrapper(Ret(*f)(Args...)) {
  return Wrapper<T, Ret, Args...>(f);
}
template<class T>
void inspect(const T&) {
  std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
  constexpr auto foobar_int = make_wrapper<Foo>(Foo::bar<int>);
  inspect(foobar_int);
  foobar_int(4);
  constexpr auto foobar_double = make_wrapper<Foo>(Foo::bar<double>);
  inspect(foobar_double);
  foobar_double(3.8);
  return 0;
}