pol*_*pts 7 c++ java templates
我有一个Java代码,其中函数的返回类型具有无界通配符类型(?).如何在C++中模拟这样的东西?例如
public GroupHandlerSetting<?> handleGroupProcessingFor(final EventHandler<T> eventHandler)
{
return new GroupHandlerSetting<T>(eventHandler, eventProcessors);
}
Run Code Online (Sandbox Code Playgroud)
在C++中,所有类型参数都必须具有名称,无论您是否使用它,因此没有问号.只需将它作为函数的模板参数并给它一个名称,你应该没问题.
template <typename T>
struct templ {
template <typename U>
void assign( templ<U> & u ); // public void assign<?>( temple<U> u )
};
Run Code Online (Sandbox Code Playgroud)
这是微不足道的部分,更复杂的部分是对类型强制执行约束,为此您可以使用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 )
}
Run Code Online (Sandbox Code Playgroud)
那就是使用C++ 11作为SFINAE,在C++ 03中,它有点复杂(好像这个版本很简单)因为你不能在函数模板参数上使用SFINAE,所以SFINAE需要应用于返回类型或额外函数参数.SFINAE是一个更强大的解决方案,它可以用来不仅为super和extends,但与类型许多其他功能或编译的时间值.谷歌为SFINAE,你会发现很多SFINAE使用的案例,其中许多将是C++ 03风格.
有一个概念的提议可以大大简化语法,但没有达成协议,并且为了推动标准完成,它被推迟到以后的标准.
现在,这在C++中并不像在Java中那么常见,因此我建议您提供一个与您想要做的事情不同的问题,并且您将在更惯用的C++中获得设计的想法.