2016-04-12 13 views
0

C++で統計システムを作成しようとしています。これは、文字列を任意の型の値と関連付けることができます。現在、私はenumの型を追跡し、オブジェクトを指すvoid *を使用していますが、これは私がサポートしたいすべてのタイプの個別のifステートメントを作成する必要があります。何らかのテンプレートを使用して任意のタイプをサポートできるようにしたいと思います。私はいくつかのテストコードに作品のようなものを作成しましたが、問題があります。オブジェクトを型に関連付ける方法

class Test { 
    std::type_index type; 
    void *value; 

public: 
    template <typename T> 
    Test(T val) : type(typeid(val)) { 
     T *val_p = new T; 
     *val_p = val; 
     value = (void *)val; 
    } 

    Test() : type(typeid(void)) { 
     value = nullptr; 
    } 

    ~Test() { 
     //no idea how I could make this work 
    } 

    template <typename T> 
    T get() { 
     if (std::type_index(typeid(T)) == type) { 
      T *val_p = (T *)value; 
      return *val_p; 
     } else { 
      throw std::bad_typeid(); 
     } 
    } 
}; 

は、私がこれまでの作品を持っている何が、私はデストラクタやコピー/移動コンストラクタを実装することが可能であろうとは思いません。要点は、これをすべて1つのstd::unordered_mapに保存したいので、(AFAIK)はテンプレートクラスを作成してそこから移動することはできません。それで、私がやろうとしていることをすることは可能ですか?もしそうなら、どうしたらいいですか?

+0

を格納し、あなたがそれらの任意の種類を絞り込むことができた場合は、 'union'はあなたに有用である可能性があります。 – CodeMouse92

+0

boost :: variantが必要なようです。 –

+1

あなたは 'boost :: any'を探しているようです。通常、あなたは実際には( 'boost :: variant')でも変種が必要です。 – GManNickG

答えて

0

GManNickGの提案に基づいて、私はboost::anyに行っています。これは、私が探しているものに最も似ています。

私はまだコードにそれを実装していないが、基本的な構造はの線に沿って何かのようになります。これにより

#include <typeinfo> 
#include <boost/any.hpp> 

class Statistic { 
    boost::any value; 

public: 
    template <typename T> 
    Statistic(T val) : value(val) {} 

    Statistic() : value() {} 

    template <typename T> 
    bool checkType() { 
     return typeid(T) == value.type(); 
    } 

    //Will cause an exception if the type doesn't match 
    //Caller should check type if unsure 
    template <typename T> 
    T get() { 
     if (checkType<T>()) { 
      return boost::any_cast<T>(value); 
     } else { 
      //throw some exception 
      throw bad_any_cast(); 
     } 
    } 
} 

、私はデストラクタやコピー/移動に対処する必要はありません。暗黙的なものは、すでにブーストライブラリによって実装されているコードを呼び出すからです。

EDIT:boost::anyを指摘しmilleniumbugへ おかげで、すでにstd::type_info

+0

この回答を、今後同じ問題を持つ人々に役立てることができるように、最終的な解決策に少し入れてお勧めします。今、この答えは基本的にはダウンボートの餌に絡んでいます。 – user4581301

+2

'boost :: any'はすでに' std :: type_info'をあなたのために保存しています( '.type()'参照) – milleniumbug

+0

ああありがとう。私は例外を少なくするためにそれをやっていましたが、それは簡単です –

関連する問題