说明
调用非静态类成员需要指明是哪个对象调用的,所以需要传入类对象。
示例代码
#include <iostream>
struct A
{
int a(int v)
{
return v;
}
void b()
{
std::cout << "b" << std::endl;
}
int c = 666;
static int d(int v)
{
return v;
}
static void e()
{
std::cout << "e" << std::endl;
}
static int f;
};
int A::f = 456;
/// @brief 调用一个非静态类成员函数
template <typename ObjT, typename RetT, typename... ArgsT>
RetT call(ObjT &obj, RetT (ObjT::*func)(ArgsT... args), ArgsT... args)
{
return (obj.*func)(args...);
}
/// @brief 获取一个非静态类成员变量
template <typename ObjT, typename VarT>
VarT get(ObjT &obj, VarT(ObjT::*var))
{
return obj.*var;
}
/// @brief 调用一个静态类成员函数
template <typename RetT, typename... ArgsT>
RetT call(RetT (*func)(ArgsT... args), ArgsT... args)
{
return (*func)(args...);
}
/// @brief 获取一个静态类成员变量
template <typename VarT>
VarT get(VarT *var)
{
return *var;
}
int main()
{
A a;
std::cout << "non-static call(a, &A::a, 999)" << std::endl;
std::cout << call(a, &A::a, 999) << std::endl;
std::cout << std::endl;
std::cout << "non-static call(a, &A::b)" << std::endl;
call(a, &A::b);
std::cout << std::endl;
std::cout << "non-static get(a, &A::c)" << std::endl;
std::cout << get(a, &A::c) << std::endl;
std::cout << std::endl;
std::cout << "static call(&A::d, 123)" << std::endl;
std::cout << call(&A::d, 123) << std::endl;
std::cout << std::endl;
std::cout << "static call(&A::e)" << std::endl;
call(&A::e);
std::cout << std::endl;
std::cout << "static get(&A::f)" << std::endl;
std::cout << get(&A::f) << std::endl;
std::cout << std::endl;
return 0;
}