Недавно я обнаружил, что функции-члены шаблонов классов не создаются до тех пор, пока они не будут использованы, что крайне раздражает, потому что делает некоторые конструкции SFINAE не работающими.Я хотел бы знать, как убедиться, что функция-член специализации шаблона класса всегда создается, как только создается экземпляр класса, - но только с использованием операторов внутри определения шаблона класса, так что если функция-член не может быть создана, Включается SFINAE, и компилятор возвращается к шаблону общего класса.
Код, который я планировал использовать, выглядит следующим образом:
template <typename T, typename U>
class test_type {
// general template; dummy parameter U is to allow specialization.
static const bool value = false;
}
template <typename T>
class test_type<T, T> {
// template specialization
void f(T t) {
// do all sorts of type-specific operations with t
// (e.g., calling member functions)
// if T is not suitable for these operations, I want
// a substitution error to be generated so that the
// general template is used instead
}
static const bool value = true;
}
template <typename T>
using satisfies = test_type<T, T>::value;