c++ - 如何将具有相同类型的不同 vector 数据成员的类对象传递给可以对任何这些数据成员进行操作的函数

标签 c++ class vector

假设我有以下 C++ 代码:

#ifndef _XMaster_
#define _XMaster_
class XMaster
{
public:
    XMaster(string A, string B, string C)
    {
        nM = A;
        oC = B;
        nI = C;
    }

    string nM;
    string oC;
    string nI;

    vector<int> TSNRay;
    vector<int> TSNFor;
};
#endif

void Hershika(vector<XMaster> &Tapren, size_t IS);

int Main()
{
    vector<XMaster> Tapren;

    // Let's just say I have x number of elements in Tapren vector and the vector 
    // data members TSNRay and TSNFor both filled

    size_t IS = 0;

    for(IS; IS < Tapren.size(); ++IS)
    {
        Hershika(Tapren, IS);
    }

    return 0;
}

void Hershika(vector<XMaster> &Tapren, size_t IS)
{
    vector<int>::const_iterator AIT;

    if(!Tapren[IS].TSNRay.empty())
    {
        for (AIT = Tapren[IS].TSNRay.begin() ; 
            AIT != Tapren[IS].TSNRay.end(); ++AIT)
        {
            AnDt(Tapren, *AIT, IS);         
        }
    }   
}

我的问题是如何使函数 Hershika 与数据成员 TSNRay 或 TSNFor 一起工作,因为它们都是同一类型?如图所示,它只能访问TSNRay。调用时如何指定需要传递TSNRay或TSNFor?

谢谢!

最佳答案

使用指向成员的指针

typedef vector<int> XMaster::* XMasterVectorPtr;

void Hershika(vector<XMaster> &Tapren, XMasterVectorPtr member, size_t IS);

void Hershika(vector<XMaster> &Tapren, XMasterVectorPtr member, size_t IS)
{
    vector<int>::const_iterator AIT;

    if(!(Tapren[IS].*member).empty())
    {
        for (AIT = (Tapren[IS].*member).begin() ; 
            AIT != (Tapren[IS].*member).end(); ++AIT)
        {
            AnDt(Tapren, *AIT, IS);         
        }
    }   
}

你可以这样调用它:

Hershika(Tapren, &XMaster::TSNRay, IS);
Hershika(Tapren, &XMaster::TSNFor, IS);

有几种不同的方法可以在不使用指向成员的指针的情况下重写它,例如只接受对 vector<XMaster> 的引用。和 vector<int>你想处理。这可能允许您消除 IS参数,如果AnDt()不需要它。 (如果不能看到该功能,很难说清楚。)

使用对目标 vector 的引用

第二种选择是简单地要求引用 vector<int>您需要对其进行操作。

void Hershika(vector<XMaster> &Tapren, vector<int> const &member, size_t IS);

void Hershika(vector<XMaster> &Tapren, vector<int> const &member, size_t IS)
{
    vector<int>::const_iterator AIT;

    if(!member.empty())
    {
        for (AIT = member.begin() ; AIT != member.end(); ++AIT)
        {
            AnDt(Tapren, *AIT, IS);         
        }
    }   
}

这样调用:

Hershika(Tapren, Tapren[IS].TSNRay, IS);
Hershika(Tapren, Tapren[IS].TSNFor, IS);

使用 lambda

这是一种仅限 C++11 的方法,但它可以在两个地方使用,以显着减少代码的大小,同时提高可读性。

template <typename Selector>
void Hershika(vector<XMaster> &Tapren, Selector selector, size_t IS)
{
    auto const & member = selector(Tapren);

    std::for_each(member.begin(), member.end(),
        [&Tapren, IS] (int i) { AnDt(Tapren, i, IS); });
}

这样调用:

Hershika(Tapren, [] (XMaster &x) { return x.TSNRay; }, IS);
Hershika(Tapren, [] (XMaster &x) { return x.TSNFor; }, IS);

关于c++ - 如何将具有相同类型的不同 vector 数据成员的类对象传递给可以对任何这些数据成员进行操作的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26641277/

相关文章:

c++ - 带有 cout 的编译器错误消息

c++ - ADO Recordset Field Value to C++ vector/array(捕获指针值)

C++条件模板编译基于数据类型

c++ - 使用可变参数模板在 C++ 中实现差异化

c++ - 相互依赖的 C++ 类,由 std::vector 持有

objective-c - NSString 实例将其类报告为 NSCFString

c++ - 具有不同签名的多态性和重载函数

c++ - 两个构造函数,哪个是默认的?

c++ - vector 大小不会随着变量的添加而增加

c++ - 声明 SystemC 类型的 vector sc_fix