2016-06-21 11 views
1

私は汎用の C++のパラメータチェッカーで、オプションを追加して内容を解析できるようにしています。C++の汎用パラメータチェッカー

class Param 
{ 
public: 
    Param(); 
    ~Param(); 

    template <typename T> 
    void add_option(std::string, std::string, T&); // flag, description, storage value 

protected: 
    std::map<std::string, IOption> options; 
}; 

template <typename T> 
void Param::add_option(std::string, std::string, T&) // Is templated to add an option depending on its type 
{} 

template<> void Param::add_option<int>(std::string, std::string, int &); 
template<> void Param::add_option<std::string>(std::string, std::string, std::string &); 

あなたは私がmapに新しいオプションを保存したい見ることができるように、ここではクラスのオプションがあり、それは「インターフェース」です:

template <typename T> 
class Option : public IOption 
{ 
public: 
    Option(std::string flag, std::string desc, T &ref) : flag_(flag), desc_(desc), ref_(ref) {} 
    ~Option() {} 

    std::string getFlag() 
    { 
    return (flag_); 
    } 

protected: 
    std::string flag_; 
    std::string desc_; 
    T    &ref_; 
}; 

class IOption 
{ 
public: 
    virtual ~IOption() {} 
    IOption() {} 

    virtual std::string getFlag() = 0; 
}; 

ここ

は私Paramクラスですこのインタフェースを作成したのは、テンプレート化されていてもマップにオプションを格納するためです。

しかし

フィールドタイプ「IOptionは」何私からジェネリックパラメータチェッカーを作成するための最良の方法だろう何

抽象クラスであるため、今、私はコンパイルできませんC++で持っている?

+2

IOptionのポインタを格納しますか? std :: map 詳細はこちらhttp://stackoverflow.com/questions/15188894/why-doesnt-polymorphism-work-without-pointers-references – SnoozeTime

+2

@SnoozeTime、またはさらに良い[スマートポインタ](http://en.cppreference.com/w/cpp/memory/unique_ptr) – StoryTeller

答えて

3

抽象クラスのインスタンスを格納することはできません。あなたはポインタまたはスマートポインタを使用して、このようなoptions宣言を変更する必要があります。

std::map<std::string, IOption*> options; 

または

std::map<std::string, std::unique_ptr<IOption> > options; 

または

マップクラスは、キー/値のペアのためのストレージを割り当てる必要が
std::map<std::string, std::shared_ptr<IOption> > options; 
+2

何かが共有されていない限り、銃を飛ばして 'shared_ptr'を使用しないでください。必要ないオーバーヘッドがあります。 – StoryTeller

+0

@StoryTellerですが、 'std :: unique_ptr'は初心者のためにこのコンテキストでは使いにくいでしょう – user2807083

+1

Paramがポインタを所有しているならばunique_ptrを使う方が良い – SnoozeTime

1

あなたはそれに追加します。定義によって、抽象クラスのインスタンスをインスタンス化することはできないため、記憶領域のサイズを決定することはできません。

だから、IOptionへのポインタまたはスマートポインタを格納します。

関連する問題