Я хотел бы использовать SFINAE для перегрузки шаблона функции на основе того, объявляет ли аргумент шаблона тип T
. Это где я был в состоянии получить до сих пор:Проверка наличия объявления типа для SFINAE
struct C1 {
using T = int;
};
struct C2 {
using T = void; // but I would really like
// to not require T at all
};
// For classes that declare T
template <class C>
void f(C &c, typename std::enable_if<!std::is_same<typename C::T, void>::value,
int>::type = 0) {
(void)c;
std::cout << "With T" << std::endl;
}
// For classes that do not declare T (for now, T must be declared void)
template <class C>
void f(C &c, typename std::enable_if<std::is_same<typename C::T, void>::value,
int>::type = 0) {
(void)c;
std::cout << "Without T" << std::endl;
}
int main() {
C2 c;
f(c);
return 0;
}
Как (если вообще) можно ли изменить это решение таким образом, что C2
не нужно было объявлять T
вообще? То есть Я хотел бы иметь две перегрузки: один для классов, объявляющих T
, и один для классов, которые этого не делают.
Почему это не работает с этим определением 'void_t':' template struct void_t {}; ' –
AlwaysLearning
@AlwaysLearning, какой тип' void_t {} 'имел? Вы имели в виду 'void_t = void;'? –
Прости, да. template using void_t = void; –
AlwaysLearning