[英]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是一個功能更強大的解決方案,它不僅可以用於提供super
和extends
,還可以用於其他許多類型或編譯時間值的功能。 谷歌為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.