gpt4 book ai didi

c++ - 集合中的智能指针多态性

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:54 29 4
gpt4 key购买 nike

我正在尝试通过初始化列表初始化指向类 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

有没有一种简单的方法可以做到这一点,而不必在调用方法中创建指针?

相关文章 ( How do I implement polymorphism with std::shared_ptr? ) 对这个问题没有提供太多帮助。

最佳答案

std::initializer_list<T>按值保存传递的对象,因此不能存在多态性。还有 std::make_shared<A>总是生成 A 类型的对象,而不是从 A 派生的某种类型.你需要另一种方法。

由于您有任意数量的任意类型的参数,您可能需要一个可变参数模板构造函数。

编辑:我的代码建议太复杂了。 WhozCraig 的评论要好得多:

template<class... Args>
Test(Args&&... args) :
vec { std::make_shared<std::remove_reference_t<Args>>(std::forward<Args>(args))... }
{
}

关于c++ - 集合中的智能指针多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539001/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com