C++では、使用するかどうかにかかわらず、すべての型引数には名前を付ける必要があります。疑問符はありません。関数のテンプレート引数にして、名前を付けて、あなたはうまくいくはずです。
些細な部分です
template <typename T>
struct templ {
template <typename U>
void assign(templ<U> & u); // public void assign<?>(temple<U> u)
};
、より複雑な部分は、型の制約を強制され、そのためにあなたはSFINAEを使用することができます。
で、SFINAEためのC++ 11を使用している
template <typename T>
struct templ {
template <typename U, typename _ = std::enable_if<
typename std::is_base_of<U,T>::value
>::type >
void super(templ<U> & u); // public void super_<? super T>(templ<?> u)
template <typename U, typename _ = std::enable_if<
typename std::is_base_of<T,U>::value
>::type >
void extends(templ<U> & u); // public void extends_<? extends T>(templ<?> u)
}
C++ 03では、関数テンプレート引数でSFINAEを使用できないので、(このバージョンが単純だったかのように)ちょっと畳み込まれているので、SFINAEを戻り値の型または余分な関数の引数のいずれかに適用する必要があります。 SFINAEははるかに強力なソリューションであり、super
とextends
を提供するだけでなく、多くの他の種類の機能やコンパイル時の値を提供するために使用できます。 SFINAEのためのGoogleとあなたはSFINAEが使用されている多くのケースを見つけるでしょう、それらの多くはC + + 03スタイルになります。
構文が大幅に簡略化されるが、合意に達することはなかった概念が提案され、標準を完了まで移して後の標準で延期した。
これはC++ではJavaほど一般的ではないので、あなたは何をしたいのかという別の質問をすることをお勧めします。より慣用的なC++でデザインのアイデアを得ることができます。
また、C++テンプレートはJava Genericsと少し似ていません。 C++テンプレートは新しい型を作成します。 Java Genericsは既存の型を制限します。 C++のテンプレートは、基本的にグラフト・オン・タイプのルールを持つ前処理です。 Java Genericsは型理論に基づいて構築されています。表記法に似ていると考えることに惑わされないでください。彼らはそうではありません。 – EJP
Joshua Bloch氏は、さまざまなビデオで、戻り値の型にワイルドカードを使用しないことを述べています。彼らはあなたのケースでは良いアイデアだと確信していますか?あなたはその機能または少なくともその署名を投稿できますか? – fredoverflow
お願いします、機能を追加できますか? –