2012-03-23 16 views
5

C++ 11で導入された型安全な可変関数を使用したいが、異なる型では使用しない。 例:同じ型のパラメータを持つ型安全な可変関数

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

すべてのパラメータの種類が同じであるので、そのような何か書くこと多分可能です:

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

それはmingwのG ++ 4.5でこのエラーでコンパイルしました:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

彼は{5, 6}がタイプPointであることを知りませんので。解決策は何ですか?

+0

してください/ var/variadic/ –

+1

あなたのデータは本当に 'max_element'のようなものが適切でない複数の非集約変数に格納されていますか? –

+0

関数を特殊化しないでください。代わりに述語を渡してください。 – Xeo

答えて

10

バリデーションテンプレートを使用すると、ではなくです。関数テンプレートと一緒に使用すると、引数の型を推測することを意図しています。それはあなたがやりたいことではありません。あなたは引数が期待される型を取ることを望みます。

私はこれで実用的な多くの経験を持っていないが、あなたは、このために初期化子リストを使用したいと思います

:その後、

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

あなたは、任意の種類でこれを使用することができないと文句を言うかもしれませんが、どのようなタイプが関係しているかをどこかに伝える必要があることを認識する必要があります。 ...引数の型を指定する必要がありますが、テンプレートにすることもできます。

関連する問題