[C++] 类成员访问

说明

调用非静态类成员需要指明是哪个对象调用的,所以需要传入类对象。

示例代码

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值