替换大写结构中的每个构件

Replacing every member of a structure in upper case

本文关键字:构件 结构 替换      更新时间:2023-10-16

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

我会使用指向成员的指针吗?

例如:

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);
  }
}

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

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

我并不认为以下内容是一个好主意、可移植、可靠或以任何方式推荐。然而,如果你正在做的是一次性的事情,而你只需要完成你的工作,你可以尝试以下方法。

您可以使用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),则可以取消显示。

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

然而,如果你正在为商用喷气式客机或其他飞机制作自动驾驶仪,请不要这样做。