2015-12-22 2 views
0

На каком-то ресурсе я увидел код:Шаблон синтаксис Объяснение

struct C 
{ 
    template <typename T, typename = typename enable_if<!is_same<C, typename decay<T>::type>{}>::type> 
    C(T&& f){} 
} 

Я старался изо всех сил, но все еще нуждаются в уточнении. Я знаю, что эта страшная вещь нужна для идиомы SFINAE - если что-то не работает, шаблонная функция просто не будет создана. Вот что я нашел:

  1. typename decay<T>::type - это снимает отборочные резюме от типа T, или преобразует массив T указателю T или преобразует T функционировать указатель. Но что это такое typename? Я полагаю, что это связано с зависимым типом, т. Е. Поставляемый тип T - это вещь, которая является частью другого шаблона, не так ли?
  2. is_same<A, B>{} - что это такое {} брекеты здесь? Зачем?
  3. typename enable_if<A>::type - как я понял, если A, истинно type поле существует и в этом случае это void, так как только один аргумент был передан enable_if, верно? Но опять же - что это за typename?
  4. template <typename T, typename = typename A> - что это такое typename = typename A? Где вообще имя аргумента ?!

ответ

2
  1. Да, имяТипа ключевое слово в этом случае говорит компилятор, что распад :: тип действительно типа (но не статические переменной std::decay<T>, например)
  2. std::is_same бросили оператор BOOL, и через {} объект этого типа создается, а затем преобразуется в bool (во время компиляции). Альтернативный вариант std::is_same<...>::value
  3. Если std::is_same возвращает истина, то член типа из std::enable_if является существует и SFINAE может пройти через эту функцию
  4. Имя параметра не нужно в этом контексте (так как он не используется где-то)

PS std::enable_if выглядит, что

template<bool B, class T = void> //(1) 
struct enable_if {}; 

template<class T> /(2) 
struct enable_if<true, T> { typedef T type; }; 

Таким образом, если первый параметр ложно то первичный шаблон (1) выбран, и он не Типу элемент, но в случае, когда это правда специализации (2) выбрано

Смежные вопросы