摘要 class 存在模板函数问题

Abstract class with template function issue

我有一个摘要struct I,方法aBB2 将从它继承。 X 结构有一个 I 类型成员,将通过基于类型的 createInsance 模板方法实例化它。我想在 B2 上添加一个附加功能 b2Exclusive,但我收到编译错误,它在 A.

中不存在

error: ‘using element_type = struct B’ {aka ‘struct B’} has no member named ‘b2Exclusive’

有什么方法可以在不为 B 定义 b2Exclusive 的情况下解决这个问题并保持这种结构?

#include <iostream>
#include <memory>
using namespace std;

struct I
{
    virtual void a() = 0;
};

struct B : public I 
{   
    B()
    {
        std::cout<<"B\n";
    }
    void a()
    {
        std::cout<<"-a from B\n";
    }
};

struct B2 : public I
{ 
  B2()
  {
    std::cout<<"B2\n";
  }
  void a()
  {
    std::cout<<"-a from B2\n";
  }
  void b2Exclusive()
  {
       std::cout<<"-something for B2\n";
  }
};

using Iptr = std::shared_ptr<I>; 

struct X
{
    void createI()
    {
        if (type == "B")
        {
            createInstance<B>();
        }
        else 
        {
            createInstance<B2>();
        }
        
    }
    
    template <typename T>
    void createInstance()
    {
        auto i = std::make_shared<T>();
        if (type == "B2")
        {
            i->b2Exclusive();
        }
        
    }
    std::string type = "None";
};

int main()
{
    
    X x;
    x.type = "B2";
    x.createI();

    return 0;
}

如果模板函数使用类型名称 B2,则只能调用 b2Exclusive:一种方法是为该类型创建特化,例如:

struct X
{
    void createI();
    
    template <typename T>
    void createInstance()
    {
        //do something
        
    }
    
    std::string type = "None";
};

template<>
void X::createInstance<B2> ()
{
    auto i = std::make_shared<B2>();
    i->b2Exclusive();
}

void X::createI()
{
    if (type == "B")
    {
        createInstance<B>();
    }
    else 
    {
        createInstance<B2>();
    }
    
}

int main()
{
    
    X x;
    x.type = "B2";
    x.createI();

    return 0;
}