10

パックに for each 型Store<TArgs...>を持つ可変引数テンプレート クラスをインスタンス化したいと考えています。std::vectorTArgs...

template<typename... TArgs> class Store {
    // obviously not valid code
    // assuming each type of TArgs... has a `unsigned int` id that can be
    // retrieved with getId<T>()
    std::array<sizeof...(TArgs), std::vector<TArgs...>> bags;

    template<typename T> void add(T mValue) { 
        bags[getId<T>()].push_back(mValue); 
    }

    template<typename T> std::vector<T>& get() { 
        return bags[getId<T>()]; 
    }
};

私が持っているとしましょうStore<int, float, double>intfloatおよびdouble値を格納できることは、コンパイル時に明らかにわかっています。

テンプレートの特殊化を使用できます。

template<> class Store<int, float, double> {
    std::vector<int> vi;
    std::vector<float> vf;
    std::vector<double> vd;

    template<typename T> void add(T);
    template<> void add<int>(int mValue) { vi.push_back(mValue); }
    template<> void add<float>(float mValue) { vf.push_back(mValue); }
    template<> void add<double>(double mValue) { vd.push_back(mValue); }
    // ...
};

...しかし、それは可能なタイプのすべての組み合わせを手書きする必要があり、ユーザー定義のタイプでは機能しません。

コンパイラーは、可変個引数テンプレートを使用するようなクラスを生成するために必要なすべてを知っていると確信していStore<int, float, double>ます。この意図を実際に表現する方法はありますか?

4

2 に答える 2