2016-06-28 10 views
7

テンプレートはテンプレート関数とクラスのプログラミングに適しているので、コードを短くしてコンパイラに任せることができます。Variadicテンプレートと値なし

私の場合、私はテンプレートクラスを利用したいと思います。

template <typename T, typename G> class unicorn { 
T value01; 
G value02; <- not used in ever instance of class unicorn 
}; 

方法は、使用されるか、またはを指定しない場合、コンパイラは一例であり、ため型名T = int型でインスタンスを作ること、あります型名Gなしのバージョン

のような結果になるように:あなたはユースケースの有限数を持ち、深く飛び込むしたくない場合は

unicorn <double, int>; 

class unicorn { 
double value01; 
int value02; 
}; 

そして、引数または指定された型名のないG

unicorn <double> 

class unicorn { 
T value01; 
// "not included in this instance" 
}; 
+0

テンプレートを1つのタイプにするか、または可変のテンプレートとstd :: tupleに分けるか? – KIIV

+0

2つ以上のテンプレートパラメータを必要としないように注意して 'std :: tuple'を再開発しようとしているようです。 –

答えて

5

をテンプレートのメタプログラミングでは、テンプレートの特殊化を簡単に行うことができます。

#include <iostream> 
using namespace std; 

template <typename... Args> 
struct Something; 

template <typename T> 
struct Something<T> { 
    T a; 
}; 

template <typename T, typename U> 
struct Something<T, U> { 
    T a; 
    U b; 
}; 

int main() { 
    __attribute__((unused)) Something<int> a; 
    __attribute__((unused)) Something<int, double> b; 

    return 0; 
} 

一般的なケース私はstd::tupleがここでそのトリックをするかもしれないと思います。あなたはstd::refやタプルとget<>機能のようないくつかの点に注意する必要があり、次のコード

もちろん
#include <tuple> 
#include <iostream> 
using namespace std; 

template <typename... Args> 
class Something { 
    std::tuple<Args...> tup; 
}; 

int main() { 
    __attribute__((unused)) Something<int> a; 
    __attribute__((unused)) Something<int, double> b; 

    return 0; 
} 

を見てみましょう。いくつかのテンプレートメタプログラミングを使用して、テンプレートパックのタイプにアクセスすることもできます。私はここでそれを説明していないので本当に長い答えがあるかもしれません。あなたがまだ私にそうしたいと思うなら、私は下のコメントで私に知らせてください、そして私はあなたにそれを説明しようとします。

+0

特殊化の一般化を試みる必要があります。 – user2296177

+0

@ user2296177申し訳ありません私は私が従うとは思わない、あなたはどういう意味ですか? – Curious

+0

」と「」に特化しないでください。「」と「」に特化してください。例:2つのタイプの特殊化は 'template struct何か {T a; U b; }; ' – user2296177

関連する問題