集合中的智能指针多态性
Smart pointer polymorphism in collections
我试图通过初始化列表初始化A
的指针集合。但是,初始化器列表不能将引用用作模板类型。
我有以下代码。
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <initializer_list>
#include <memory>
struct A
{
virtual void f() const noexcept { std::cout << "A"; }
};
struct B : public A
{
virtual void f() const noexcept override { std::cout << "B"; }
};
class Test
{
std::vector<std::shared_ptr<A>> vec;
public:
Test(const std::initializer_list<A>& list)
//Test(const std::initializer_list<A&>& list) <------ Solution?
{
for (auto& x : list)
vec.push_back(std::make_shared<A>(x));
}
void print()
{
std::for_each(vec.begin(), vec.end(), [](auto x) { x->f(); });
}
};
int main()
{
Test test = { A(), B() };
test.print();
}
代码打印:
aa
它应该打印:
ab
有没有一种简单的方法来执行此操作,而无需在调用方法中创建指针?
相关文章(我如何用std :: shared_ptr实现多态性?)没有在此问题上提供太多帮助。
std::initializer_list<T>
按值保持传递的对象,因此不可能有多孔症。另外,std::make_shared<A>
总是制造一个类型A
的对象,而不是源自A
的某种类型。您需要另一种方法。
由于您有任意数量的具有任意类型的参数,因此您可能需要一个variadic模板构造函数。
编辑:我的代码建议太复杂了。Whozcraig的评论更好:
template<class... Args> Test(Args&&... args) : vec { std::make_shared<std::remove_reference_t<Args>>(std::forward<Args>(args))... } { }
您正在使用std::make_shared<A>()
插入向量。您将一堆B
和A
复制到一堆A
中。
如果您要主管中的语法工作,那么最简单的方法就是一个模板:
struct Foo {
template<typename... Args>
Foo(Args... args) :
vec{std::make_shared<Args>(std::move(args))...}
{}
private:
std::vector<std::shared_ptr<A>> vec;
};
您在以下行中制作新的shared_ptr
s
vec.push_back(std::make_shared<A>(x));
x
是什么都没关系,您制作了一个具有其值的新A
。
您可能要创建shared_ptr<A>
并将指针从x.get()
传递到新的空shared_ptr<A>
相关文章:
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 具有智能指针的多态性
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 如何调用指针类型的方法(禁用多态性)?
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 如何避免指针超出范围(多态性)的C++分段错误
- C++ 被此代码与多态性、指针和对象切片混淆
- 在同时处理基类的多个指针时如何处理多态性?
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 与智能指针和矢量C 的多态性有关的问题
- C - 删除多态性指针
- 载体包含指向多态性类别的指针
- 集合中的智能指针多态性
- 多态性和STL容器.指针是不必要的
- 由支持多态性的值池存储,如何使用智能指针
- 如果我需要多态性,我应该使用原始指针而不是unique_ptr
- 没有指针的多态性
- 如何在使用动态多态性时避免指针
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分