Использование класса ограничений

229
06 октября 2017, 17:37

Задача заключается в проверке наличия у типа T функции определенного вида. Используем класс ограничений. За счет наследования вызывается конструктор. Не понимаю, как он вызывает статическую функцию, чтобы получилась (если все плохо) ошибка в строке с заданием адреса указателю на функцию. В к-ре же вроде просто присвоение указателю адеса этой функции.

template<typename T>
class Has_f
{
public:
    static void Constraints()
    {
        T* (T::*test)() const = &T::f;
        test;
    }
    Has_f() { void (*p)() = Constraints; }
};

Наш класс:

template <typename T>
class C : Has_f<T>
{
    // ...
};

Почему автор написал именно так? Можно же просто вызвать в конструкторе {Constraints();} или нет? Фрагмент взят из книги Г. Саттера.

Answer 1

Вызвать-то можно. Но зачем?

Все проверки чисто статические, не дающие никакого выполнимого кода, т.е. никаких накладных расходов времени выполнения.

Update
Есть у меня вариант в С++11 сделать попроще:

template<typename T, 
         typename = enable_if_t<is_same<decltype(&T::f), // Имя функции-члена
                                T* (T::*)()>::value>>    // Ее тип, что нам нужен
class C
    ...

Ну, или еще веселее:

static_assert(is_same<decltype(&T::f),T* (T::*)(int)>::value,"Error");

Гуру стандартов, что скажете?...

READ ALSO
Оконное приложение(расписание поезда Qt_5) [требует правки]

Оконное приложение(расписание поезда Qt_5) [требует правки]

Нужно разработать программу, управляющую списком из двух записейРабота в Qt, нужно создать оконное приложение

219
C++ - std::mutex на разных платформах

C++ - std::mutex на разных платформах

В моем приложении осуществляется отрисовка и расчет положения шариков в разных потокахДля управления доступом к разделяемым данным (координатам...

318
Как проверить работу holdReady jquery?

Как проверить работу holdReady jquery?

Почему alert выводится? $holdReady(true); alert(777); Какой наглядный пример может показать работу данного метода?

229