Может ли кто-нибудь объяснить мне следующие строки относительно «частичного упорядочения» в шаблоне C ++ —
«Шаблон X более специализирован, чем шаблон Y, если каждый список аргументов, который соответствует списку, указанному в X, также соответствует списку, указанному в Y, но не наоборот».
Я не мог понять смысл этого предложения.
Я пытаюсь объяснить это на примере.
Посмотрите на следующее struct foo
// generic
template <typename T1, typename T2>
struct foo
{ };
// partial specialization
template <typename T2>
struct foo<int, T2>
{ };
// full specialization
template <>
struct foo<int, long>
{ };
Существует три версии: общая версия, частичная специализация и полная специализация.
Рассмотрим следующие списки аргументов
1) int, long
2) int, int
и соблюдать полную и частичную специализацию.
Список (1) соответствует обеим специализациям (с T2
равно long
) когда список (2) совпадает только частичная специализация.
Каждый список аргументов, который соответствует полной специализации (только список (1)), соответствует частичной специализации, но существует список, который соответствует частичной специализации (list (2)), который не соответствует полной специализации.
Согласно ссылкам, которые вы приводите, полная специализация «более специализирована», чем частичная специализация.
Вы также можете увидеть, что частичная специализация является «более специализированной», чем универсальная версия, потому что каждый список, соответствующий частичной специализации, также соответствует универсальной версии (с T1
равно int
) но существует список (long, int
, например), которые соответствуют универсальной версии, но не соответствуют частичной специализации.
Также очевидно, что полная специализация более специализирована, чем универсальная версия.
// Y
template <typename T1, typename T2>
struct foo {};
// X
template <typename T>
struct foo<int, T> {};
«Шаблон X более специализирован, чем шаблон Y, если каждый список аргументов, который соответствует списку, указанному в X, также соответствует списку, указанному в Y, но не наоборот».
// Imagine all possible argument lists for X. They will always match Y.
foo<int, int> f1;
foo<int, double> f2;
foo<int, my_object> f3;
/* ... */
// Imagine all possible argument lists for Y. They will not always match X.
foo<double, int> f4;
foo<int, double> f5;
foo<char, my_object> f6;
/* ... */
Следовательно, X
более специализированный, чем Y
,