"Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса" - читать интересную книгу автора (Гусаров Михаил)

Проблема “return void”

Посмотрим внимательнее на реализацию функции operator() в нашем адаптере. Что будет, если мы захотим в качестве типа возвращаемого значения функции использовать void? Наша функция запишется так: void operator() {return void;}. С точки зрения стандарта все хорошо, но все в нашем мире определяется стандартом: есть компиляторы, которые не воспринимают такую конструкцию как допустимую.

ПРИМЕЧАНИЕ Таков, к примеру, Microsoft Visual C++ 6.0/7.0

К счастью, на помощь нам опять приходит частичная специализация:

templatelt;class T, class TTgt;

struct gen_mem_fun_operatorlt;void, T, TTgt; {

 void operator()(TT p, void (T::*pm)()) {(p.operator-gt;()-gt;*pm)();}

};


templatelt;class Tgt;

struct gen_mem_fun_operatorlt;void, T, T*gt; {

 void operator()(T* p, void (T::*pm)()) {(p-gt;*pm)();}

};