Здравствуйте Anton V. Kolotaev, Вы писали:
AVK>Здравствуйте jazzer, Вы писали:
J>>В общем, давайте возьмемся за руки и все вместе пообещаем друг другу писать у своих функций exception specifications! (Хотя бы при помощи дефайнов )
AVK>Это, конечно, замечательно. А если все на шаблонах сидит?
AVK>AVK>template <class T>
AVK>int f() // вот что здесь прописать???
AVK>{
AVK> return T::f(); // неизвестно, какие исключения f может кидать.
AVK> // мы должны пропустить их все или часть
AVK>}
AVK>
AVK>Так что, в бесшаблонном коде спецификация исключений — благо, а в шаблонном — неясно, что делать.
Боюсь, что тут не просто неясно, что делать, а просто нечего делать
Ведь так как спецификация исключений не является частью типа функции, для шаблона она не будет видна ни при каком раскладе, просто в синтаксисе С++ нет соответствующего механизма.
Видимо, остается делать то же, что мы делаем, когда пишем шаблон для классов, которые должны выполнять некий протокол, непроверяемый компилятором — т.е. верить на слово.
Например, если T::f() — это size или что-то в этом роде, не должное по сути своей выбрасывать никаких исключений, то мы имеем полное право объявлить нашу шаблонную функцию как не выбрасывающую исключений.
Или это, например, — файловый класс, который может выбрасывать исключения только из соответствующего дерева классов исключений, тогда корень этого дерева можно передавать в качестве параметра шаблона (как это происходит в STL с их многочисленными внутренними typedef-ами), например:
template <class File, class FileException = File::exception_type>
int f() throw (FileException)
{
...
};
Это — один способ.
Второй заключается в том, что в месте инстанцирования мы знаем, какой класс мы используем и какие исключения его методы будут выбрасывать, соответственно мы можем ту финкцию, из которой происходит вызов нашей шаблонной функции, объявить со спецификацией исключений, соответствующей используемому классу.
А вообще, тема очень интересна и заслуживает отдельного топика.