2016-12-18 14 views
2

任意の次元数のジオメトリでベクトルのテンプレートクラスを作成しようとしています。直感的なコンストラクタを作成して、ディメンション番号と等しい数のイニシャライザを渡すことができます。例:C++:任意の数の初期化引数を持つテンプレートクラス/関数

template<int dim = 3, typename float_t=double> class Vec{ 
    float_t x[dim]; 
public: 
    Vec(...) { 
     //some template magic 
    } 
}; 


int main() { 
    typedef Vec<3> Vec3d; 
    typedef Vec<2> Vec2d; 

    double x=1,y=2,z=3; 
    Vec3d v(x,y,z); 
    Vec2d w(x,y); 
} 

私はブラックマジックの知識が不足しています。つまり、C++テンプレートです。私の目標を達成するためにこの例をどのように書くべきですか?もちろん、すべてのケースで正確なコンストラクタを書く必要はありません。それはC++テンプレートの精神ではありません。私は本当にスマートな方法でそれを達成する方法に本当に興味があります。

答えて

6

あなたはparameter packが必要です

template <typename... Args> 
Vec(Args... args) : x{args...} { 
    static_assert(sizeof...(Args) == dim, "Number of parameters should match dimension"); 
} 

私はまた、ユーザーは、ディメンションに一致するパラメータの正しい数を入力することを確認するstatic_assertを使用しています。

+0

それは素晴らしいです!ありがとう、またstatic_assertのために、私はそれを知らなかった! :D – Ch3shire

関連する問題