1

最初にお詫び申し上げます。私の質問のタイトルが私が求めていることを正確に説明しているかどうかさえわかりません。すでにそこに(またはStackOverflow上にさえ)あります。

基本的に次のようなテンプレート化されたクラスがあります-シングルトンパターンを使用するため、すべてが静的です。実際にキーをセットに保存したり、文字列などを使用したりする理由についてのコメントは探していません。ソリューションを提供します。クラスにはもう少しありますが、それは質問には関係ありません。

template<typename T>
class MyClass 
{
private:
  //Constructor and other bits and peices you don't need to know about
  static std::set<std::string> StoredKeys;
public:
  static bool GetValue(T &Value, std::string &Key)
  {
    //implementation
  }

  static SetValue(const T Value, std::string &Key)
  {
    //implementation
    StoredKeys.Insert(Key);
  }

  static KeyList GetKeys()
  {
    return KeyList(StoredKeys);
  }
};

後で、アプリケーションの他の部分で、タイプに関係なく、すべての値のすべてのキーを取得したいと考えています。

現時点では、クラスで使用されている型は 3 つまたは 4 つだけであるとかなり確信していますが、次のように書くことができます。

KeyList Keys = MyClass<bool>::GetKeys();
Keys += MyClass<double>::GetKeys();
Keys += MyClass<char>::GetKeys();

これは、新しいタイプが使用されるたびに更新する必要があります。また、どこにも使用されていない場合、クラスをインスタンス化するという欠点もあります。

メタプログラミングがここでの答えだと思います (これも間違っている可能性があります)。おそらく何らかのマクロでしょうか?

ブーストを使用しているので、MPL ライブラリがここで役立つと思いますか?

STL のこの側面は私には少し新しいので、解決策を設計するために何が必要かを正確に理解したらすぐに、必要なだけ読んで学ぶことができてうれしいです。

4

3 に答える 3

0

StoredKeysテンプレート以外の基本クラスに移動するか、テンプレート以外の基本クラスに静的メンバーをclass MyClassBase追加します。AllStoredKeys

SetValueまたは、ポインタをStoredKeys静的リストに追加するfrom と呼ばれる静的 init メソッドを作成します。

于 2012-06-13T10:37:59.870 に答える
0

魔法はありません。プログラムでインスタンス化するために使用されるすべての型を列挙する必要がある場合はMyClass、明示的に列挙する必要があります。何とかして。また、リストが変更されるたびに手動でリストを更新する必要があります。

テンプレートのメタプログラミングを使用すると、手動で更新する必要がある場所の数を 1 つに減らすことができますが、その 1 つの場所は必要です。

幸いなことに、この特定の問題では、すべての型を列挙する必要はありません。複数のセットにキーを分割するのではなく、すべてのキーを 1 つのセットに格納するだけで済みます。共通の非テンプレート ベースを作成してそこMyClassに追加することもできますstatic std::set<std::string> StoredKeys(またはmultiset、異なるタイプ固有のセットに同一のキーが存在する可能性がある場合は、それを にすることもできます)。

于 2012-06-13T10:46:38.453 に答える
0

最初の答え: それは不可能です! テンプレート クラスは、実際には (Java のように) 共通の「ジェネリック」を持っていませんが、互いに何の関係もない個別のクラスを持っています。

2 番目の回答: 回避策があります。MyClassBaseテンプレート化されたすべてのサブクラスで共有されるプロパティを定義する基本クラスを定義できます。問題は、ここにシングルトン パターンがあり、状況が少し複雑になる可能性があることです。解決策は次のようになると思います。

class MyClassBase {
  static std::vector<MyClassBase*> childs;

  static KeyList getAllKeys(){
       //iterate over childs here and call ->GetKeys
  }

  virtual KeyList GetKeys() = 0;

  template<typename T>
  static T* instance() {
     T* instance = MyClass<T>::instance();
     if(std::find(childs.begin(), childs.end(), instance) != childs.end()){
       childs.push_back(instance);
     }
     return instance;
  }
};

構文エラーがあればご容赦ください。私は Stackoverflow エディターでそれを入力しただけですが、私の主張を明確にする必要があると思います。

編集: サブクラスのシングルトンメソッドにもinstance(). これはおそらく機能しません。などの別の名前を付けprivateInstance()ます。T* instance = MyClass<T>::instance();次に、に変更する必要がありますT* instance = MyClass<T>::privateInstance();

于 2012-06-13T10:50:03.363 に答える