3

プロジェクトに取り組んでいるときに、このコードに出くわしました。これを理解しようとしています:

enum Attributes { ACTIVE, COMPLETE, POSITION }
template<Attributes NN,typename TT>  
TT& Set(TT&& t) 
{ 
    return typeList.get<NN>()=t; //typeList is a boost tuple
}

これは後で呼び出されます

object.Set<ACTIVE>(true);

テンプレート パラメータは 1 つしかありません。2 つのパラメーターでテンプレートを指定し、それを 1 つだけで呼び出すにはどうすればよいでしょうか? Set メソッドは、std::map のように 2 つのテンプレート パラメーター (属性と型名) を受け取ることになっていると思います。

4

3 に答える 3

3

2 つ目は、関数に渡される引数の型から推測されます。この場合はbool.

于 2012-07-26T20:06:42.190 に答える
1

関数の引数の型である関数テンプレートテンプレートパラメータを呼び出す場合、引数の型から自動的に推測できます。関数は次のように呼び出されます。

object.Set<ACTIVE>(true); //same as object.Set<Active,bool>(true);
object.Set<ACTIVE>(5);    //same as object.Set<Active,int>(5);

これが、引数のタイプを明示的に言及するstd::maxかどうかにかかわらず、標準ライブラリのテンプレート関数を使用できる理由です。std::copy

于 2012-07-26T20:07:31.120 に答える
1

これを読む。

関数テンプレートの特殊化が参照される場合、すべてのテンプレート引数に値が必要です。値は明示的に指定することも、場合によってはデフォルトのテンプレート引数の使用または取得から推測することもできます。

[ Example:
void f(Array<dcomplex>& cv, Array<int>& ci) {
sort(cv); // calls sort(Array<dcomplex>&)
sort(ci); // calls sort(Array<int>&)
}
and
void g(double d) {
int i = convert<int>(d); // calls convert<int,double>(double)
int c = convert<char>(d); // calls convert<char,double>(double)
}
—end example ]

およびこのドキュメントの14.8.2パー。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

于 2012-07-26T20:14:15.130 に答える