【问题标题】:C++ Equivalent of Java GenericsJava 泛型的 C++ 等价物
【发布时间】:2015-03-13 07:52:29
【问题描述】:

我需要将一些 java 类转换为 C++。例如,对于如下所示的 java 接口:

public interface ListenerManager<L> {

    void addListener(L listener);

    void removeListener(L listener);

}

我的 C++ 有点生疏,所以我试图找出最好的翻译方法是什么。我在想这样的事情:

class IListener;
class ListenerManager
{
    virtual void add_listener(IListener listener);
    virtual void remove_listener(IListener listener);
};

然后在项目的其他地方将IListener 定义为基类。

这是正确的方法吗?

编辑:

感谢cmets!如果我要使用模板,像这样:

template<class L>
class ListenerManager
{
    virtual void add_listener(L listener);
    virtual void remove_listener(L listener);
};

...但是我有许多不同的侦听器类型,比如ListenerAListenerB,那么我是否需要在实现中对每种类型进行专门化?

【问题讨论】:

标签: java c++ code-translation


【解决方案1】:

你的意思是模板

比如

template<typename L>
class ListenerManager
{
    virtual void add_listener(L listener);
    virtual void remove_listener(L listener);
};

【讨论】:

    【解决方案2】:

    虽然它们并不完全相同,但 Java 泛型可以翻译为 C++ 模板。

    template <typename T>
    class ListenerManager
    {
        virtual void add_listener(T listener);
        virtual void remove_listener(T listener);
    };
    

    【讨论】:

    • 您能否在一行中详细说明“不完全相同”以避免主要的跨语言陷阱?
    【解决方案3】:

    您在 C++ 中使用 模板;经常比较,但不一样。

    template <class L>
    class ListenerManager
    {
    public:
      void add_listener(L listener);
      void remove_listener(L listener);
    };
    

    这将创建一个键入L 的类,它是您的侦听器管理器。以下代码创建了一个类,其中每个add_listener 方法都是一个模板,可以使用不同的类型。

    class ListenerManager
    {
      template <class L>
      void add_listener(L listener);
      // ...
    };
    

    基于问题和示例;我怀疑您可能正在寻找某种基类IListener 来多态地处理某种容器中的侦听器(这样模板可能无法解决您遇到的问题)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 2010-11-19
      • 2010-10-24
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多