假设我有以下 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/