Re[37]: Исключения и шаблоны
От: jazzer Россия Skype: enerjazzer
Дата: 19.09.02 07:48
Оценка:
Здравствуйте 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)
{
...
};


Это — один способ.

Второй заключается в том, что в месте инстанцирования мы знаем, какой класс мы используем и какие исключения его методы будут выбрасывать, соответственно мы можем ту финкцию, из которой происходит вызов нашей шаблонной функции, объявить со спецификацией исключений, соответствующей используемому классу.


А вообще, тема очень интересна и заслуживает отдельного топика.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.