Безопасное стирание типов без буста и с ++ 0x - PullRequest
3 голосов
/ 10 июля 2011

Скажем, у меня есть шаблонный класс

template<class T>
class A;

template<>
class A<int>
{
    public:
         void print(){ std::cout << "I am an int !" << std::endl; }
};

template<>
class A<double>
{
    public:
         void print(){ std::cout << "I am a double !" << std::endl; }
};

Теперь, если я хочу сохранить все возможные экземпляры A в одном и том же контейнере, скажите вектор.

Тогда классический (иЕдинственный способ, который я знаю) - это создать другой класс A_base с чисто виртуальной функцией-членом print () и хранить указатель на A_base, инициализированный для экземпляров A. Выполнение этого с новым может вызвать утечки памяти и / или исключение безопасности, поэтомуспособ решить эту проблему - использовать boost :: shared_ptr или std :: tr1 :: shared_ptr, потому что копирование std :: auto_ptr может привести к проблемам с владением и неопределенному поведению!

Есть ли способ сделать типстирание без включения буста или с ++ 0x зависимостей?:)

Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

Единственный ответ на этот вопрос - «Бросьте свой собственный класс, который уже существует в Boost», хотите ли вы ptr_vector, shared_ptr, any и т. Д. У них уже есть все основания, которые рассматриваются в этом отношении. Выберите свою любимую и сверните свою собственную реализацию, затем используйте это.

Редактировать: Комментатор упомянул TR1. Хороший крик. TR1 содержит shared_ptr.

1 голос
/ 10 июля 2011

Посмотрите на boost / any.hpp. Я сделал.

...