C ++では、使用するかどうかに関係なく、すべての型引数に名前を付ける必要があるため、疑問符はありません。関数のテンプレート引数にして名前を付けるだけで問題ありません。
template <typename T>
struct templ {
template <typename U>
void assign( templ<U> & u ); // public void assign<?>( temple<U> u )
};
これは些細な部分であり、より複雑な部分は型に制約を適用することであり、そのためにSFINAEを使用できます。
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 )
}
つまり、SFINAEにC ++ 11を使用していますが、C ++ 03では、関数テンプレート引数でSFINAEを使用できないため、少し複雑になっています(このバージョンは単純であるかのように)。したがって、SFINAEはどちらにも適用する必要があります。戻り型または追加の関数引数。SFINAEははるかに強力なソリューションであり、タイプやコンパイル時の値を提供するだけsuper
でなく、他の多くの機能とともに使用できます。extends
Google for SFINAEを使用すると、SFINAEが使用されているケースが多く、その多くはC++03スタイルになります。
構文を大幅に簡素化する概念の提案がありましたが、合意には至らず、標準を完成させるために、後の標準に延期されました。
さて、これはJavaの場合ほどC ++では一般的ではないので、やりたいことについて別の質問をすることをお勧めします。そうすれば、より慣用的なC++での設計のアイデアを得ることができます。