2016-10-14 7 views
3

クラステンプレートのテンプレート引数は、現在は関数テンプレートの場合のように多かれ少なかれ推測されます。
Hereが該当する論文です。上記の論文の例としてクラステンプレートと複数のパラメータパックのテンプレート引数の控除

:控除が発生したときに

template<class ... Ts> struct X { X(Ts...) }; 
X x1{1}; // OK X<int> 
X x11; // OK X<> 

関数テンプレートは、別の興味深い特徴を持っています。
は、次のコードを考えてみましょう:

template<typename... U, typename... T> 
auto func(T&&...) {} 

// ... 

// U is int, char - T is int, double 
func<int, char>(0, .0); 

私たちは、限り控除は、それらを区別するのに役立ちますようパック2つのパラメータを持つことができます。
タプルなどの構造体にラップする必要はありません。

クラステンプレートでも同じことが可能ですか?

例として:紙は以下の例が含まれ

template<typename... U, typename... T> 
struct S { 
    S(T&&...) {} 
}; 

// ... 

// U is int, char - T is int, double 
S<int, char> s{0, .0}; 

:とにかく

template<class ... Ts> struct X { X(Ts...) }; 
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*> 

を、それはまったく同じものではありませんし、私はそれがされるかどうかわからないんだけど許可されているかどうか。

答えて

4

これ:

template<typename... U, typename... T> 
struct S { ... }; 

がちょうど[temp.param]あたり悪い形成されている:

主要クラステンプレート、主要変数テンプレート、またはエイリアスのテンプレートパラメータ場合テンプレートはテンプレートパラメータパックです。最後はテンプレートパラメータになります。

このケース:X<int>はすでに有効なタイプであるため、

template<class ... Ts> struct X { X(Ts...) }; 
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*> 

には問題があります。

???がある
X<string, ???> x3{"a", 1, "b"}; // X<string, int, const char*>. 

:それは将来的にいくつかの提案は、それが可能なクラステンプレートのパラメータのいくつかを推定する必要があるが、他の人が指定されなければならないことを示すために作ることが可能ですけれども、紙のこの部分は、オウルに滴下し、意図を明確にする一連のトークン。

+0

答えは - _noなので、許されませんよ、そうですか? – skypjack

関連する問題