0

我有一个 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);
}
4

3 回答 3

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);
  }
}
于 2013-07-29T22:25:29.493 回答
1

我并不声称以下内容是一个好主意、便携、可靠或以任何方式推荐。但是,如果您正在做的是一次性的事情并且您只需要完成您的工作,您可以尝试以下方法。

您可以使用offsetof获取第二个成员的偏移量,然后将其用作一些指针操作的步骤。例如:

#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),你可以抑制它。

就像我说的那样,我很确定这不能保证在一天中的任何时候都适用于所有结构上的所有编译器,但是在您的特定情况下它可能对您有用,如果确实如此,也许它已经足够好了并且让你继续你的一天。

但是,如果您正在为商用喷气式客机或其他东西制作自动驾驶仪,请不要这样做。

于 2013-07-29T19:22:03.173 回答
1

如果你有 100 个字符串成员,我认为最好的办法是重构这个类,使其拥有一个字符串向量而不是那些成员。在这种情况下,对所有字段的任何操作都将是微不足道的——只需遍历容器。

我很难想象你怎么能管理班级里的 100 名成员。

于 2013-07-29T18:58:27.593 回答