Как использовать std :: auto_ptr для достижения ковариационного присваивания?

У меня есть следующий вариант использования, но я не могу понять, как заставить его работать:

enum MyTemplateEnum { A, B };
template<MyTemplateEnum T = A>
class MyTemplateClass<T> {
// ...
};

std::string argument = ...;
std::auto_ptr<MyTemplateClass<> > instance;
if (argument == "a") {
std::auto_ptr<MyTemplateClass<A> > temp(new MyTemplateClass<A>(...));
instance = temp;
} else
if (argument == "b") {
std::auto_ptr<MyTemplateClass<B> > temp(new MyTemplateClass<B>(...));
instance = temp;
}

это приводит к ошибке компиляции, потому что я в принципе не могу назначить конкретную реализацию std::auto_ptr<MyTemplateClass<A> > на общую версию std::auto_ptr<MyTemplateClass<> >,

3

Решение

Вам нужен общий базовый класс для всех экземпляров MyTemplateClass<T> шаблон. В противном случае все институты являются несвязанными классами.

class MyTemplateBase {
public:
// Don't forget virtual destructor.
virtual ~MyTemplateBase() {}
};

template<typename T = A>
class MyTemplateClass : public MyTemplateBase {
};

std::auto_ptr<MyTemplateBase> instance;
if (argument == "a") {
instance.reset(new MyTemplateClass<A>(...));
} else if (argument == "b") {
instance.reset(new MyTemplateClass<B>(...));
}

Обратите внимание, что std::auto_ptr устарел. Если возможно использовать std::unique_ptr или же boost::scoped_ptr вместо.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector