我有一个 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
对返回类型使用相同的类型,基本上与您在函数体中所做的完全一样。