2017-02-04 11 views
0

別のクラスのテンプレートクラスのテンプレート引数を設定する方法はありますか?私は、2つの値を持つ特定の型(通常、均一など)の分布を生成するクラスを作成したいと考えています。クラスは次のように呼ばれるべきである。C++の他のクラスのテンプレート引数を設定する

Dist normal("normal",0,1) // this should construct std::normal_distribution<double> normal(0,1); 
Dist uniform("uniform",1,10); //std::uniform_real_distribution<double> uniform(1,10); 

一つの方法は、同様にDistクラステンプレートクラスを作ることであろう。しかし、Distを非テンプレートクラスにしたいと思います。理由は、私は得るべきstd :: vectorの別のクラスがDistの入力(std::vector<Dist>)であるということです。 Distがテンプレートクラスの場合、私はこれを行うことができません。

答えて

1

しかし、上記のようにすることが可能かどうかを知りたいと思います。

はい、私はあなたがそれをしたいと思っていません。何らかの種類の実行時の "string to factory"マップとタイプ消去を使用する必要があります。あなたが述べたように

struct VectorBase 
{ 
    virtual ~Vector() { } 

    // Common interface 
    virtual void something() { } 
}; 

template <typename T> 
struct VectorImpl : Vector 
{ 
    std::vector<T> _v; 

    // Implement common interface 
    void something() override { } 
}; 

struct Vector 
{ 
    std::unique_ptr<VectorBase> _v; 

    Vector(const std::string& type) 
    { 
     if(type == "int") 
      _v = std::make_unique<VectorImpl<int>>(); 
     else if(type == "double") 
      _v = std::make_unique<VectorImpl<double>>(); 
     else 
      // error 
    } 

    // Expose common interface... 
}; 

推奨/最適な方法を作るために、あるVectorクラステンプレート

template <typename T> 
struct Vector 
{ 
    std::vector<T> _v; 

    template <typename... Ts> 
    Vector(Ts&&... xs) : _v{std::forward<Ts>(xs)...} { } 
}; 

使用法:

Vector<int> IntVec(1, 2); 
Vector<double> DoubleVec(1.0, 2.0); 
+0

ありがとう!私は私の質問を編集しました。私は今、私がしたいことがより明確になることを願っています。 – beginneR

関連する問題