我有一个类widget
。
我有一个抽象类base
与衍生物derived_a
,derived_b
等传递存储成员的列表作为成员
我想widget
来保存从base
为了以后多态使用它们衍生化对象的任意量。
我第一次尝试是这样的:
#include <vector>
#include <ostream>
#include <iostream>
#include <memory>
class widget {
public:
explicit widget(std::vector<std::unique_ptr<base>>&& params) :
members {std::move (params)}
{
}
private:
std::vector<std::unique_ptr<base>> members;
};
,并会叫这样的:
std::vector<std::unique_ptr<base>> v;
v.push_back(std::move(std::make_unique<derived_a>()));
widget w (std::move(v));
然而,这种解决方案接缝unnessesarry冗长而不是用户友好可言,特别是提供多个时类型:
std::vector<std::unique_ptr<base>> v;
v.push_back(std::move(std::make_unique<derived_a>()));
v.push_back(std::move(std::make_unique<derived_b>()));
v.push_back(std::move(std::make_unique<derived_c>()));
v.push_back(std::move(std::make_unique<derived_a>()));
v.push_back(std::move(std::make_unique<derived_b>()));
v.push_back(std::move(std::make_unique<derived_c>()));
widget w {std::move(v)};
而是,我宁愿使用沿线的
widget w {derived_a(),
derived_b(),
derived_c(),
derived_a(),
derived_b(),
derived_c()};
使widget
设有右值,它则可以变成std::vector<unique_ptr<base>>
的列表。
我的印象是,这可以通过模板化ctor来实现,但是,尽管大量使用Google,但我并不知道如何完全实现我的目标。
请注意,看起来类模板解决此题刻:
widget<derived_a,
derived_b,
derived_c,
derived_a,
derived_b,
derived_c> w;
是不可取的,因为我需要提供一些deriveds与参数。
对不起 - 我在一段时间内没有考虑到面向对象的问题......但是,你可以通过使用工厂类来获得更简单的代码吗? ''class wf {static std :: unique_ptr make_a(/ *也许有些参数* /){...}; ...};''然后是''widget w; w.visuals({wf :: make_a(); ...})''? –
BitTickler
只是稍微“少”冗长。 AFAIK你不需要'push_back'中的'移动' – Hayt
好的尝试我的工厂理念有点失败。看起来'std :: unique <>''在处理抽象基类时遇到了问题。谁会猜到他们在内部尝试复制? :) – BitTickler