template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
Ви повинні використовувати std::size_t
замість int
.
біжи сюди
Редагувати:
Власне, ваші коментарі та моя інтуїція щодо коду змусили мене зануритися в тему. На перший погляд, стандартний розробник (як я) очікує, що компілятор перетвориться int
на std::size_t
(оскільки вони є цілісним типом і неявно перетворюється дуже тривіально) і вибере void foo(std::vector<std::array<T1, SIZE>> bar)
найкращу спеціалізацію. Отже, читаючи сторінку виведення аргументів шаблону, я виявив це:
Якщо параметр шаблону нетипового типу використовується в списку параметрів і виводиться відповідний аргумент шаблону, тип виведеного аргументу шаблону (як зазначено в його вкладеному списку параметрів шаблону, тобто посилання зберігаються) повинен відповідати типу параметр шаблону нетипового шаблону, за винятком того, що cv-класифікатори випадають, і за винятком випадків, коли аргумент шаблону виводиться із зв'язаного масиву - у цьому випадку дозволений будь-який інтегральний тип, навіть bool, хоча він завжди стане істинним:
Як завжди, звичайно, ви повинні прочитати ще кілька разів, ніж раз, щоб зрозуміти, що це означає :)
Так виходить цікавий результат.
Наша бажана спеціалізація вже не обрана, але якби компілятор був змушений вибрати, це була б помилка.
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo(b); // P = std::vector<std::array<int,(int)SIZE>
// A = std::vector<std::array<int,(unsigned_long)SIZE>>
// error: deduced non-type template argument does not have the same
// type as its corresponding template argument */
}
запустити код
Ще одна цікава річ:
Якби аргумент шаблону нетипового типу не був виведений, не було б обмеження, яке змушує аргументи та типи шаблонів бути однаковими.
#include <vector>
#include <array>
#include <iostream>
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo<int,3>(b);
}
запустити код
vector
на всіх. Дивіться тут