私は、以下の内容が良いアイデアであるとか、移植可能であるとか、信頼できるものであるとか、何らかの形で推奨されるものであると主張しているわけではありません。ただし、やっていることは 1 回限りのことであり、仕事を終わらせる必要があるだけの場合は、次のことを試すことができます。
を使用offsetof
して 2 番目のメンバーのオフセットを取得し、それをポインター操作のステップとして使用できます。例えば:
#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を使用している場合)。
私が言ったように、これがすべての構造体のすべてのコンパイラで 1 日いつでも機能することが保証されているわけではないと確信していますが、特定のケースでは機能する可能性があります。あなたの一日を続けることができます。
ただし、商用ジェット旅客機などのオートパイロットを作成している場合は、これを行わないでください。