0

100 個の文字列メンバーを含む C++ 構造体があります。その各メンバーで検索と置換を行う必要があります。

1 つの方法は、すべてのメンバーに対して行うことです。より良い方法はありますか?

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

100 個の文字列メンバーがある場合、このクラスをリファクタリングして、それらのメンバーの代わりに文字列のベクトルを持つようにするのが最善だと思います。この場合、すべてのフィールドに対する操作は簡単です。コンテナーを反復処理するだけです。

クラスで 100 人のメンバーを管理する方法を想像することはほとんどできません。

于 2013-07-29T18:58:27.593 に答える
1

私は、以下の内容が良いアイデアであるとか、移植可能であるとか、信頼できるものであるとか、何らかの形で推奨されるものであると主張しているわけではありません。ただし、やっていることは 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 日いつでも機能することが保証されているわけではないと確信していますが、特定のケースでは機能する可能性があります。あなたの一日を続けることができます。

ただし、商用ジェット旅客機などのオートパイロットを作成している場合は、これを行わないでください。

于 2013-07-29T19:22:03.173 に答える