C++ 泛型列表赋值

标签 c++ generics list templates stl

我显然已经在 J​​ava 领域停留太久了...是否有可能执行与以下 Java 代码等效的 C++:

interface Foo {}

class Bar implements Foo {}

static List<Foo> getFoo() {
  return new LinkedList<Foo>();
}

static List<Bar> getBar() {
  return new LinkedList<Bar>();
}

List<? extends Foo> stuff = getBar();

其中 Foo 是 Bar 的子类。

所以在 C++ 中....

std::list<Bar> * getBars()
{
  std::list<Bar> * bars = new std::list<Bar>;
  return bars;
}

std::list<Foo> * stuff = getBars();

希望这是有道理的....

最佳答案

改变

std::list<Bar> & getBars()

std::list<Bar> getBars()

这原则上会按值返回,但是有复制构造省略机制,所以优化编译器应该可以优化

std::list<Bar> bars (getBars());

不涉及复制构造函数,直接构建bars

此外,在 C++0x 中有移动构造函数,因此即使出于任何原因没有删除复制/移动,上述代码也是高效的。

编辑遗漏的子类问题:

一般来说,这在 C++ 中是不可能完全做到的(我假设 FooBar父类(super class),否则呢你所做的毫无意义)。一些 reinterpret_cast 黑魔法可能是可行的,但我强烈建议不要这样做。

最接近的近似值可能是这样的(相应地调整了 getBars()):

std::list <Bar*>  bars (getBars ());
std::list <Foo*>  foos (bars.begin (), bars.end ());

但是,这会给您带来一些不平凡的内存管理负担。使用某种自动指针可能会有所帮助,但据我所知,只有 shared_ptr 可以在容器中使用。

最后,Foo/Bar 类层次结构应该使用虚函数,否则你想做的几乎肯定不会起作用(即除非你真的想忽略子类中的任何重写)。

关于C++ 泛型列表赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2744132/

相关文章:

c++ - 是否有一个 Visual Studio 插件可以防止编写不匹配的 { 和 }

C++11 range-for 多维数组循环

c# - 在 C# 中编辑列表 <double[]> 的问题

c++ - 如何从任意客户端查找 DHCP 租约信息?

c++ - < 变为 > 时,如何优雅地避免代码重复?

c# - 如何将子类分配给非泛型类中的泛型字段

c# - 如何使用内部构造函数从具有新约束的泛型类创建实体

c# - C#中构造函数的where子句?

python - 取数字列表的绝对值

python 列表/序列格式