簡體   English   中英

如何在Java中將'問號(?)'類型泛型模仿到C ++?

[英]How to emulate 'question mark(?)' type generics in Java to C++?

我有一個Java代碼,其中函數的返回類型具有無界通配符類型(?)。 如何在C ++中模擬這樣的東西? 例如

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

在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 )
}

那就是使用C ++ 11作為SFINAE,在C ++ 03中,它有點復雜(好像這個版本很簡單)因為你不能在函數模板參數上使用SFINAE,所以SFINAE需要應用於返回類型或額外函數參數。 SFINAE是一個功能更強大的解決方案,它不僅可以用於提供superextends ,還可以用於其他許多類型或編譯時間值的功能。 谷歌為SFINAE,你會發現很多SFINAE使用的案例,其中許多將是C ++ 03風格。

有一個概念的提議可以大大簡化語法,但沒有達成協議,並且為了推動標准完成,它被推遲到以后的標准。

現在,這在C ++中並不像在Java中那么常見,因此我建議您提供一個與您想要做的事情不同的問題,並且您將在更慣用的C ++中獲得設計的想法。

您的具體示例很容易完成,因為我不使用Java,所以我無法理解為什么它需要<?> 在C ++中,您只需填寫相同的模板參數:

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

T將從傳遞給handleGroupProcessingFor任何參數推斷出來,並且我們對返回類型使用相同的T ,基本上就是你在函數體中所做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM