当前位置: 首页 > 面试题库 >

C ++等同于使用 用于Java参数/返回类型

公孙森
2023-03-14
问题内容

在Java中,要使函数返回一个与参数类型相同的对象并扩展某个类,我将输入:

public <T extends MyClass> T foo(T bar) {...}

是否有与此等效的C ++?

换句话说,我如何使一个函数接受任何扩展了某个类并返回相同类型的类?(这是为了抽象/纯虚拟类的目的)。


问题答案:

enable_if如果您有C ++ 11或更高版本,我们可以在这里使用

template<typename T, typename std::enable_if<std::is_base_of<MyClass, T>::value>::type* = nullptr>
T Foo(T bar)
{
    return T();
}

例如:

class MyClass
{
public:
    int a = 1;
};

class Derived : public MyClass
{
public:
    int b = 2;
};

class NotDerived
{
public:
    int b = 3;
};

template<typename T, typename std::enable_if<std::is_base_of<MyClass, T>::value>::type* = nullptr>
T Foo(T bar)
{
    return T();
}

int main()
{
    Derived d;
    NotDerived nd;
    std::cout << Foo(d).b << std::endl;; // works
    //std::cout << (Foo(nd)).b << std::endl;; //compiler error

    return 0;
}

现场演示



 类似资料:
  • 问题内容: 实现与Java等效的C ++的首选方法是什么? 问题答案: 尝试使用: 这要求你的编译器启用rtti支持。 编辑:我对这个答案有很好的评论! 每次需要使用dynamic_cast(或instanceof)时,最好问问自己是否必要。通常,这是不良设计的标志。 典型的解决方法是将要检查的类的特殊行为放入基类的虚函数中,或者引入诸如访问者之类的东西,你可以在不更改接口的情况下为子类引入特定行

  • 我试图创建一个返回泛型类型参数的方法。 我有一个类车辆订单扩展抽象类订单。在类订单中,我创建了一个抽象方法接收HiredObject。这个方法不会接收任何参数,并将返回一个泛型。 我在VehicleOrder类中实现了这个方法,并将其设置为返回类参数vehicle。 问题是,当我实例化一个新的VeilceOrderorororororororororororororderororororororo

  • 我有这段代码来比较两个列表是否具有相同的对象: 在拆除我有这种情况: 如您所见,两个列表都有相同的对象和相同的属性。 但是,比较两个列表是否相等的代码总是返回 false。 我尝试了使用 我做错了什么?

  • 假设我已经包装了我的C类和,并且可以通过SWIG生成的模块从Python访问它们: 在Python中,我创建了面向用户的类,它是一个浅层代理,主要添加docstring,并允许IDE对参数名称进行制表符补全: 问题在于,返回类型为,它没有docstring,也不显示参数名称(swig将所有参数公开为)。相反,我希望它提供我自己的浅代理

  • 问题内容: 在C ++中,我可以定义一个 访问器 成员函数,该函数返回(或引用)私有数据成员的值,以便调用者无法以任何方式修改该私有数据成员。 有没有办法在Java中做到这一点? 如果是这样,怎么办? 我知道关键字但AFAIK应用于 方法 时: 防止在子类中重写/多态化该方法。 使该方法可内联。 (请参见下面@Joachim Sauer的评论) 但这并不限制该方法返回对数据成员的引用,以使调用者无