2015-07-10 1 views
2

Рассмотрим следующий шаблон функции:Если мы избегаем создания объектов параметра шаблона

template <typename T> 
void init() 
{ 
    std::unique_ptr<T> ptr(new T()); 
    //do some with it 
} 

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

void bar() 
{ 
    try{ 
     init<int>(); 
    } catch(___WHAT?___){ } 
} 

Дело в том, я не знаю, что делать, если consturctor T выбрасывает исключение. Я просто не знаю, что он может бросить. Конечно, я мог бы написать catch(...), но это было не очень хорошо.

Итак, что мне делать, когда мне нужно создавать объекты параметра шаблона?

+0

Зачем ловить (...) нехорошо? С какими проблемами вы сталкиваетесь? –

+0

@PaoloM Потому что это ловить все исключения, поэтому я не могу настроить обработчик, если мне это нужно ... –

+2

Если вы хотите настроить его снова на заданный тип исключения ... вы должны знать этот тип ... – marom

ответ

2

Проблема в том, что вы чувствуете необходимость обрабатывать исключения.

В C++ вы решаете соответствующие проблемы с RAII. Единственная вещь, которую должна выполнить ваша функция init(), - очистить ресурсы, которые она выделила. Ресурсы T уже очищены, а вызывающий абонент init несет ответственность за отказ init.

+0

Ну, я следую за RAII в функции 'init', обертывая динамически выделенный объект типа T в unqiue_ptr. Что не так? –

+0

В этом случае ничего - но почему вы тогда пытаетесь поймать что-то? Обратите внимание, что 'bar' вызывает' init 'и поэтому знает, что единственным возможным исключением является' bad_alloc' (из памяти). – MSalters

+0

Я просто хочу написать журнал, чтобы было проще обнаружить таких фалатов. –

Смежные вопросы