存在多种可能性时的模板推理?

问题描述 投票:0回答:1

我有以下模式:

struct Wrapper
{
   vector<shared_ptr<BaseType>> data;

   template <typename DerivedType>
   add(const DerivedType& e)
   {
     data.push_back(make_shared<DerivedType>(e));
   };
}

我的

Wrapper
的目标是使用多态性,我希望能够将任何
e
投射回其
DerivedType

如果我在没有显式模板的情况下调用

add(e)
,类型推断可以将 e
 解析为 
DerivedType

    模板推断是否也可以将
  1. e
     解析为 
    BaseType
    ,即使它不是其最派生的类型?
  2. 如果是,
  3. make_shared<BaseType>(e)
    是否会生成一个可以动态转换为
    DerivedType
    的共享指针?
  4. 如果没有,您知道比我的包装更好的设计吗?我需要包装器是可复制的。我可以添加显式模板,但我想避免它。
c++ templates inheritance polymorphism type-inference
1个回答
0
投票
模板推断是否也可以将

e

 解析为 
BaseType
,即使它不是其最派生的类型?

仅当您将

BaseType

 变量传递给 
add()
 时。

如果是,

make_shared<BaseType>(e)

是否会生成一个可以动态转换为
DerivedType
的共享指针?

不。 它会准确地创建您要求它创建的内容。 在本例中,它创建一个新的

BaseType

,它是通过将 
e
 切片为 
BaseType
 来复制构造的。  新对象中不存在 
DerivedType

© www.soinside.com 2019 - 2024. All rights reserved.