我有一个c ++结构,其中包含100个字符串成员。我需要在每个成员中进行搜索和替换。
一种方法是为每个成员做这件事。还有更好的方法吗?
typedef struct
{
std::string m;
std::string x;
} datamembers;
void replace( datamembers& src)
{
std::transform(src.m.begin() , src.m.end(), src.m.begin(), ::toupper);
std::transform(src.x.begin() , src.x.end(), src.x.begin(), ::toupper);
}
答案 0 :(得分:2)
我会使用指向成员的指针吗?
例如:
typedef struct {
std::string m;
std::string x;
} datamembers;
std::vector<std::string datamembers::*> memptrs;
void init_members() {
memptrs.push_back(&datamembers::m);
memptrs.push_back(&datamembers::x);
}
void replace( datamembers& src)
{
for (auto m = memptrs.begin(); m!=memptrs.end(); m++) {
std::transform((src.*(*m)).begin() , (src.*(*m)).end(), (src.*(*m)).begin(), ::toupper);
}
}
答案 1 :(得分:1)
如果你有100个字符串成员,我认为最好是重构这个类,以获得字符串向量而不是那些成员。在这种情况下,对所有字段的任何操作都将是微不足道的 - 只需遍历容器。
我很难想象你怎么能在班上管理100名成员。
答案 2 :(得分:1)
我并不认为以下内容是一个好主意,便携,可靠或以任何方式推荐。但是,如果您正在做的是一次性的事情而且您只需要完成工作,您可以尝试以下方法。
您可以使用offsetof
来获取第二个成员的偏移量,然后将其用作一些指针操作的步骤。 E.g:
#include <stddef.h> /*<- offsetof from here */
typedef struct
{
std::string a;
std::string b;
...
} datamembers;
void replace( datamembers& src)
{
size_t step = offsetof(datamembers, b); //<- get second member
for (int i = 0; i < sizeof(src); i += step) {
std::string *p = (std::string *)((char*)(&src) + i);
std::transform(p->begin() , p->end(), p->begin(), ::toupper);
}
}
请注意,这是一个糟糕的主意,GCC甚至会警告您以这种方式使用offsetof
。如果您想使用-Wno-invalid-offsetof
(如果您正在使用GCC),则可以禁止它。
就像我说的那样,我很确定这不是保证适用于所有结构的所有编译器,在一天中的任何时候,但是在你的特定情况下它可能适用于你,如果确实如此,也许它足够好,让你可以继续你的一天。
但是,如果您正在制作商用喷气式飞机的自动驾驶仪,请不要这样做。