C++ 使用std::initializer\u列表中的实例重写

C++ 使用std::initializer\u列表中的实例重写,c++,c++11,C++,C++11,我有一个问题: struct A { ... some const virtual members ... }; struct B: A { ... some const overrides ... }; struct C { C(std::initializer_list<A> const& list) // initialized with instances of B { for (auto const& a: list) {

我有一个问题:

struct A
{
  ... some const virtual members ...
};

struct B: A
{
  ... some const overrides ...
};

struct C
{
  C(std::initializer_list<A> const& list) // initialized with instances of B
  {
    for (auto const& a: list)
    {
      a.virtual_member_call(); // but struct B overloads do not get called
    }
  }
};
结构A { …一些常量虚拟成员。。。 }; 结构B:A { …一些常量覆盖。。。 }; 结构C { C(std::initializer\u list const&list)//用B的实例初始化 { 用于(自动常量和a:列表) { a、 virtual_member_call();//但不会调用结构B重载 } } }; 这种情况会发生,因为B的实例被复制到A的实例中。为了避免这个问题,有什么解决方法(除了从堆中分配之外)?我想可变模板构造函数可能就是这样的一种。这是由于切片而发生的

std::initializer\u list
不是多态容器,它是
a
类型值的简单容器。构建列表时,对象会被复制。从
B
类型的对象复制构建
A
类型的对象时,会发生切片。您将得到一个
A
类型的对象,它是您从中复制的
B
类型的原始对象的“A上的投影”


如果您想拥有多态类型的异构初始值设定项列表,请考虑使用(智能)指针

std::initializer\u list
?需要从堆或新位置进行分配。不,
C{&b1,&b2,&b3,&b4,}
。呵呵,好主意,但有点尴尬。还是个好主意。如果你对裸指针感到尴尬,还有
std::initializer_list
C{std::ref(b1),std::ref(b2),std::ref(b3),…}
,但这只是上面的样板。变量模板是唯一的方法吗?@user1095108:变量模板是可能的,是的,但是您也可以使用指针作为
初始值设定项列表的值,正如建议的那样。。。我希望一些不需要指针的东西,而不需要可变模板(因为太多的代码会使我的代码变得丑陋)。我知道你可能会发现这个答案有点令人不安,但是也许你可以考虑更多地了解使用模板的阅读代码。这样它们就不会再难看了:-)可变构造函数工作得很好。对于语法来说太糟糕了:)