7

関数の戻り型に無制限のワイルドカード型(?)があるJavaコードがあります。C ++でこのようなものをエミュレートするにはどうすればよいですか?例えば

    public GroupHandlerSetting<?> handleGroupProcessingFor(final EventHandler<T> eventHandler)
    {
        return new GroupHandlerSetting<T>(eventHandler, eventProcessors);
    }
4

2 に答える 2

6

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でなく、他の多くの機能とともに使用できます。extendsGoogle for SFINAEを使用すると、SFINAEが使用されているケースが多く、その多くはC++03スタイルになります。

構文を大幅に簡素化する概念の提案がありましたが、合意には至らず、標準を完成させるために、後の標準に延期されました。

さて、これはJavaの場合ほどC ++では一般的ではないので、やりたいことについて別の質問をすることをお勧めします。そうすれば、より慣用的なC++での設計のアイデアを得ることができます。

于 2012-06-21T10:33:28.960 に答える
1

あなたの具体的な例は簡単にできますが、私はJavaを使用していないので、なぜJavaが必要なのか理解できません<?>。C ++では、同じテンプレートパラメータを入力するだけです。

template<class T>
GroupHandlerSetting<T> handleGroupProcessingFor(EventHandler<T> const& evHandler){
  return GroupHandlerSetting<T>(evHandler, evProcessors);
}

Tに渡される引数から推測されます。戻り型にも同じものhandleGroupProcessingForを使用Tします。基本的には、関数の本体で行うこととまったく同じです。

于 2012-06-21T10:50:20.813 に答える