Задача заключается в проверке наличия у типа 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();}
или нет? Фрагмент взят из книги Г. Саттера.
Вызвать-то можно. Но зачем?
Все проверки чисто статические, не дающие никакого выполнимого кода, т.е. никаких накладных расходов времени выполнения.
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");
Гуру стандартов, что скажете?...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Нужно разработать программу, управляющую списком из двух записейРабота в Qt, нужно создать оконное приложение
В моем приложении осуществляется отрисовка и расчет положения шариков в разных потокахДля управления доступом к разделяемым данным (координатам...
Почему alert выводится? $holdReady(true); alert(777); Какой наглядный пример может показать работу данного метода?