如何在Java中将'问号(?)'类型泛型模仿到C++?

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)

Dav*_*eas 6

在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是一个更强大的解决方案,它可以用来不仅为superextends,但与类型许多其他功能或编译的时间值.谷歌为SFINAE,你会发现很多SFINAE使用的案例,其中许多将是C++ 03风格.

有一个概念的提议可以大大简化语法,但没有达成协议,并且为了推动标准完成,它被推迟到以后的标准.

现在,这在C++中并不像在Java中那么常见,因此我建议您提供一个与您想要做的事情不同的问题,并且您将在更惯用的C++中获得设计的想法.

  • 这不是一回事.在呼叫站点比较这两个:http://ideone.com/2LXUp和http://ideone.com/bMMJr.如果要模拟通配符,则需要键入擦除. (2认同)