如何在 Java 中模拟'question mark(?)'类型泛型以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,基本上与您在函数体中所做的完全相同。

最新更新