替换大写结构中的每个构件
Replacing every member of a structure in upper case
我有一个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),则可以取消显示。
正如我所说,我很确定这并不能保证在一天中的任何时候都适用于所有结构上的所有编译器,但它可能在您的特定情况下适用,如果适用,也许它已经足够好了,可以让您继续您的一天。
然而,如果你正在为商用喷气式客机或其他飞机制作自动驾驶仪,请不要这样做。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 带有柔性阵列构件的包装结构的便携式替代方案
- 对齐构件的对齐结构为成员(C )
- 您如何使用成员正确初始化构造的结构,该构件是指向const值的const指针
- C动态构件结构
- 结构构件对齐方式C++/提升
- 替换大写结构中的每个构件
- 具有柔性阵列构件的结构C++ 'substitute'