2016-05-17 10 views
3

混乱したタイトルのため申し訳ありません。私はそれ以外にどのように言いたいのか分かりません。例はそれ自身を説明する必要があります。テンプレートを使用したC++メンバ関数テンプレート

私はtypemapsと呼ばれるものを発見し、このように私のコードにそれを使用する:

template<typename T> 
struct typemap 
{ 
    static const int INDEX; 
}; 

template<> 
const int typemap<Type1>::INDEX = 1; 
template<> 
const int typemap<Type2>::INDEX = 3; 
template<> 
const int typemap<Type3>::INDEX = 11; 

タイプ1タイプ2タイプ3 &はstuctsであり、ここではタイプのように使用しました。 INDEX番号は構造体の内部にあることはできません。これは、異なるタイプ番号を持ち、同じタイプオブジェクトを持つ別のタイプマップが存在する可能性があるためです。したがって、typemapはベクトルのようなcolectionのstuctsの異なる順序のために働くので、注文は私にとって重要です。

次のものは、属性としてType1-3を持つ非テンプレートクラスです。そして私がしようとしているのは、std :: functionの助けを借りてこれらの属性をベクトルに挿入することです。しかし、私は一般的なタイプマップを取ってベクトルに挿入するためのインデックスとして使用する必要があります。

私はそれが動作するかもしれないと思った唯一のものは、より多くのテンプレートを使用しています。次のコードのようなものですが、これは正しい方法ではありません。まだテンプレートが新しくなっていますので、関数bodyをベクターに正しく書くために助けが必要です。ベクトル が必要です。

class MyClass 
{ 
    Type1 type1_; 
    Type2 type2_; 
    Type3 type3_; 
    .. 

    template<typename T> 
    void toVector(T& typemap) 
    { 
    std::vector<..> vect; 
    vect.resize(..); 
    vect[typemap<Type1>::INDEX] = type1_.someFunction(..); 
    vect[typemap<Type2>::INDEX] = type2_.someFunction(..); 
    } 

}; 

私はメンバ関数に間違ったテンプレートを使用すると確信しています。何とかTパラメータにもいくつかのテンプレートパラメータがあると言います。私の英語のために申し訳ありません、ネイティブスピーカーではありません。また、 ".."には申し訳ありません。私の問題とは無関係で、コードを混乱させるでしょう。

+0

[テンプレートテンプレートパラメータ](http://en.cppreference.com/w/cpp/language/template_parameters#Template_template_parameter)を探しています。 – Quentin

+1

人々が大文字の命名規則の悪い習慣を取り除くとき、大文字ですか? – Slava

+2

@Slavaなぜそれは悪い習慣ですか? – CppChris

答えて

2

INDEXに明示的な特殊化を追加する代わりに、実際のオブジェクトタイプtypemapを作成して渡しましょう。まず、いくつかの決まり文句:

template <class T> 
struct tag_type { 
    using type = T; 
}; 

template <class T> 
constexpr tag_type<T> tag{}; 

template <int I> 
using int_ = std::integral_constant<int, I>; 

今、私たちは異なるtag_type秒を取るindex()ためのオーバーロードの束を持つオブジェクトを作成し、あなたが渡すことができるものであるint_ S:

struct typemap { 
    constexpr int_<3> size() const { return {}; } 

    constexpr int_<1> index(tag_type<Type1>) const { return {}; } 
    constexpr int_<3> index(tag_type<Type2>) const { return {}; } 
    constexpr int_<11> index(tag_type<Type3>) const { return {}; } 
}; 

異なっを返します関数テンプレートに入力して使用してください:

template<typename T> 
    ??? toVector(T const& typemap) 
    { 
     std::vector<..> vect; 
     vect.resize(typemap.size()); 

     vect[typemap.index(tag<Type1>)] = ...; 
     vect[typemap.index(tag<Type2>)] = ...; 
     vect[typemap.index(tag<Type3>)] = ...; 
    } 
+0

私はconstexprに慣れていませんが、それは ' constexpr tag_type tag(){}; 'ではありません。 Btw。私はそれを試してみます、それは本当に興味深いようですが、私はまだ多くのことを学ぶ必要があることを見て、ここで使用されているコード構造のいくつかは私には新しいものです。 – Lukin

+0

@ Lukinいいえ - 余分なかっこは何のためにありますか? – Barry

+0

'g ++ -std = C++ 11'にコンパイルされません。問題があるかどうかわかりません。 'error:' constexpr const tag_type タグ 'のテンプレート宣言 – Lukin

2

バリーの答えは、あなたがしようとしていることを行う良い方法ですO行うが、ここで一つのパラメータを取るテンプレート自体であるテンプレートパラメータを持つについてのあなたの特定の質問への答えです:関数は、あなたの元の例ではT& typemapパラメータを持っていた理由を

template<template<typename> class type_with_one_template_parameter> 
    void toVector() 
    { 
    std::vector<..> vect; 
    vect.resize(..); 
    vect[type_with_one_template_parameter<Type1>::INDEX] = type1_.someFunction(..); 
    vect[type_with_one_template_parameter<Type2>::INDEX] = type2_.someFunction(..); 
    } 

それは明確ではなかったです、だから私はそれを削除しました。

関連する問題