以大写替换结构的每个成员

时间:2013-07-29 18:55:56

标签: c++ boost

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

3 个答案:

答案 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),则可以禁止它。

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

但是,如果您正在制作商用喷气式飞机的自动驾驶仪,请不要这样做。