我有一个方法a
的抽象struct I
。B
和B2
将继承它。X
结构体有一个I
类型成员,并将通过基于类型的createInsance
模板方法实例化它。我想在B2
上有一个额外的功能b2Exclusive
,但我得到了编译错误,它不存在于A
。
错误:' using element_type = struct B '{也称为' struct B '}没有名为' b2Exclusive '的成员
有没有办法解决这个问题,而不定义b2Exclusive
的B
以及保持这种方式的结构?
#include <iostream>
#include <memory>
using namespace std;
struct I
{
virtual void a() = 0;
};
struct B : public I
{
B()
{
std::cout<<"Bn";
}
void a()
{
std::cout<<"-a from Bn";
}
};
struct B2 : public I
{
B2()
{
std::cout<<"B2n";
}
void a()
{
std::cout<<"-a from B2n";
}
void b2Exclusive()
{
std::cout<<"-something for B2n";
}
};
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;
}
如果模板函数使用typename 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;
}