Специализация шаблона со значением по умолчанию - PullRequest
4 голосов
/ 02 июня 2019

Это код, с которым я работаю:

#include <iostream>
#include <type_traits>

using namespace std;

using match_type = void;
using match_type_bad = int;

// version A
template <typename T, typename Attempt = match_type>
struct simple_check : false_type {}; 

// version B
template <typename T>
struct simple_check<T, T> : true_type {}; 

int main() {
  cout << simple_check<match_type>::value << endl;
  cout << simple_check<match_type_bad>::value << endl;
}

Программа с этой специализацией шаблона в результате выдает:

1
0

В моем понимании tmp в C ++ возникает путаница, так как я предполагал, что результат должен был быть 1 1.

Мое рассуждение было:

  1. С simple_check<match_type> он переходит в версию B, а затем расширяется до simple_check<match_type, match_type>, который наследуется от true_type. Так что 1 как и ожидалось.

  2. Разве это не относится к simple_check<match_type_bad>?

  3. При такой логике любой тип X в simple_check<X> всегда должен быть версии B.

Похоже, что значение по умолчанию для версии A match_type предписывает какое-то правило при выборе версии B.

Почему версия A влияет на версию B? Возможно что-то еще?

1 Ответ

7 голосов
/ 02 июня 2019

Когда вы устанавливаете шаблон, он всегда использует базовую версию, прежде чем смотреть на специализации.Это работает здесь, так как второй параметр шаблона имеет значение по умолчанию match_type.

Итак

simple_check<match_type> => simple_check<match_type, match_type>
                                                     ^^ this uses the default value

simple_check<match_type_bad> => simple_check<match_type_bad, match_type>
                                                             ^^ again, default value

После того, как это сделано, компилятор смотрит на специализации.
Специализацияработает только в том случае, если параметры шаблона совпадают, поэтому для первой проверки специализация будет выбрана поверх базового шаблона, а для второй будет использоваться базовый шаблон, так как специализация недействительна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...