Re[12]: Универсальная прокси-функция.
От: T4r4sB Россия  
Дата: 29.09.15 09:17
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Проблема определения на момент компиляции наличия у класса метода с нужной сигнатурой решается, например, шаблонами.

...

CEM> CT<CGood> cg(1); // OK

CEM> CT<CBad> cb(1); // Error
CEM>[/ccode]

А теперь осталось это ОК/Еггог запихать в сфинью, чтобы получить HasMethod::value, и вся эта хренота вместо одной строки, которую уже десять лет просят добавить в язык.

Нагугленная же реализация примерно такая:
template <typename T>
    class HasSomeMethod
    {
        typedef char y;
        typedef y n[2];

        template <typename U, U> struct ReallyHas;
        template <typename C> static y& Test(ReallyHas <Result (C::*)(Args), &C::Method>*);
        template <typename> static n& Test(...);
    public:
    static bool const value = sizeof(Test<T>(0)) == sizeof(y);    
    };

Я до сих пор не понимаю, почему это надо делать именно так. Но когда я пробовал по-своему, по-другому, то у меня не получалось.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 29.09.2015 9:18 T4r4sB . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.