如何从指针到方法获取类(对象类型)
How get the class (object type) from pointer to method
我有一个指向该方法的指针:
struct A { int method() { return 0; } };
auto fn = &A::method;
我可以通过 std::result_of 获取返回类型,但是我如何从 fn 获取该方法的类所有者?
您可以使用类模板专用化来匹配它:
//Primary template
template<typename T> struct ClassOf {};
//Thanks T.C for suggesting leaving out the funtion /^argument
template<typename Return, typename Class>
struct ClassOf<Return (Class::*)>{ using type = Class; };
//An alias
template< typename T> using ClassOf_t = typename ClassOf<T>::type;
因此给出:
struct A { int method() { return 0; } };
auto fn = &A::method;
我们可以像这样检索类:
ClassOf_t<decltype(fn)> a;
完整示例 这里.
试试这个:
template<class T>
struct MethodInfo;
template<class C, class R, class... A>
struct MethodInfo<R(C::*)(A...)> //method pointer
{
typedef C ClassType;
typedef R ReturnType;
typedef std::tuple<A...> ArgsTuple;
};
template<class C, class R, class... A>
struct MethodInfo<R(C::*)(A...) const> : MethodInfo<R(C::*)(A...)> {}; //const method pointer
template<class C, class R, class... A>
struct MethodInfo<R(C::*)(A...) volatile> : MethodInfo<R(C::*)(A...)> {}; //volatile method pointer
提升可调用特征答案,我更喜欢这里比较短的答案,因为它对我来说更具可读性,但意见可能会有所不同......
#include<string>
#include<type_traits>
#include<tuple>
#include <boost/callable_traits/args.hpp>
struct S{
int val=46;
int get(){
return val;
}
void method(const std::string ){
}
};
int main(){
using Ts1 = boost::callable_traits::args_t<decltype(&S::val)>;
using Ts2 = boost::callable_traits::args_t<decltype(&S::get)>;
using Ts3 = boost::callable_traits::args_t<decltype(&S::method)>;
std::remove_cvref_t<std::tuple_element<0,Ts1>::type> s1;
s1.val++;
std::remove_cvref_t<std::tuple_element<0,Ts2>::type> s2;
s2.val++;
std::remove_cvref_t<std::tuple_element<0,Ts3>::type> s3;
s3.val++;
}
s1
、s2
、s3
都是S型。
显然,您只需要执行一次逻辑,我做了 3 次以表明它适用于指向成员的指针、指向需要 0 个参数的函数的指针、指向需要 1 个参数的函数的指针。
相关文章:
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 了解 Python 中的对象类型
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 基准、值、值类型、对象和对象类型(C++)
- JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
- 在构造过程中更改的对象类型
- 如何构建程序以避免查询对象类型?
- 如何使用Dynamic_cast获得对象类型
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- static_cast实际上不是对象类型的类型是未定义的行为吗?
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 类返回对象类型,但如何返回和检查 null
- 是否可以在辅助功能中概括对象类型
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 当将对象传递给具有参数作为引用类型的函数以及当其类对象类型时,会得到不同的输出
- 如何在运行时指定对象类型
- 我可以获取在重载的新运算符中使用新运算符的对象类型吗?