将成员名称作为参数传递

Passing a member name as argument

本文关键字:参数传递 成员      更新时间:2023-10-16

我正试图将类的一个成员作为参数传递给函数(而不是成员方法)。我的意图的一个简单例子是这样的。

template <typename ObjType>
void myOutput(ObjType* obj, ????)
{
    std::cout << obj->???? << std::endl;
}
struct A
{
    int a;
};
struct B
{
    std::string b;
};
int main()
{
    A A1;
    B B1;
    A1.a = 1;
    B1.b = "something";
    myOutput(&A1, A1::a);
    myOutput(&B1, B1::b);
    return 0;
}

所以我的问题是,我应该用什么来代替"???"?我没有使用C++11。

谢谢。

编辑:

澄清我的意图。函数myOutput实际上并不知道我的成员的名称,我也不想使用memberToString()之类的函数。

所以第一次调用的输出应该是这样的。

void myOutput(A* obj, ????)
{
    std::cout << obj->a << std::endl;
}

对于第二个

void myOutput(B* obj, ????)
{
    std::cout << obj->b << std::endl;
}

如果在编译时知道成员名称,则可以使用成员指针来引用该成员。

template <typename ObjType, typename MembType>
void myOutput(ObjType* obj, MembType memb)
{
    std::cout << obj->*memb << std::endl;
}

这可以这样称:

myOutput(&A1, &A::a);
myOutput(&B1, &B::b);

当然,您应该问问自己为什么要这样做,以及是否不可能简单地将A1->aB1->b作为单个参数直接传递到函数中。