Я играю с методами фильтрации типов, переданных в перегруженные шаблоны функций. Я использую Visual Studio 2013.Вывод аргумента шаблона и SFINAE - с использованием std :: enable_if
Три части вопроса:
- Почему косяк мой компилятор выводить
Blorg3
? - Является ли причина, что
TFoo2(argc)
генерирует ошибку компилятора так же, как и # 1? - Есть ли способ передать параметры шаблона конструктору?
Вот пример кода:
#include <type_traits>
#define IFPTR(T,R) typename std::enable_if<std::is_pointer<T>::value, R>::type
#define IFINT(T,R) typename std::enable_if<std::is_integral<T>::value, R>::type
template <class T, IFINT(T, T)* = nullptr> int Blorg1(T n) { return n + 1; }
template <class T, IFPTR(T, T)* = nullptr> int Blorg1(T n) { return *n + 1; }
template <class T> IFINT(T, int) Blorg2(T n) { return n + 1; }
template <class T> IFPTR(T, int) Blorg2(T n) { return *n + 1; }
template <class T> int Blorg3(IFINT(T, T) n) { return n + 1; }
template <class T> int Blorg3(IFPTR(T, T) n) { return *n + 1; }
struct TFoo1 {
template <class T, IFINT(T, T)* _ = nullptr> TFoo1(T n) { }
};
struct TFoo2 {
template <class T> TFoo2(IFINT(T, T) n) { }
};
int main(int argc, char* argv[])
{
Blorg1(argc); // intellisense not happy
Blorg2(argc);
Blorg3<int>(argc); // why cant deduce?
Blorg1(*argv); // intellisense not happy
Blorg2(*argv);
Blorg3<char*>(*argv); // why cant deduce?
(void)TFoo1(argc); // intellisense not happy
(void)TFoo2(argc); // intellisense not happy and !!wont compile!!
return 0;
}
1. Поскольку параметр шаблона появляется только в * inested-name-specifier *, который является не выводимым контекстом (т. Е. Этот параметр шаблона не выводится из аргументов в этот конкретный параметр). 2. yes 3. no – Columbo