template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
Powinieneś użyć std::size_t
zamiast int
.
biegnij tutaj
Edycja:
W rzeczywistości twoje komentarze i moja intuicja dotycząca kodu skłoniły mnie do zagłębienia się w temat. Na pierwszy rzut oka standardowy programista (jak ja) oczekuje, że kompilator przekonwertuje się int
na std::size_t
(ponieważ oba są typem integralnym, a konwersja domyślna jest bardzo trywialna) i wybierze void foo(std::vector<std::array<T1, SIZE>> bar)
najlepszą specjalizację. Tak więc podczas czytania strony z dedukcją argumentów szablonu znalazłem to:
Jeśli na liście parametrów zostanie użyty niepoprawny parametr szablonu, a wywnioskowany zostanie odpowiedni argument szablonu, typ wywnioskowanego argumentu szablonu (określony w załączonej liście parametrów szablonu, co oznacza, że odniesienia zostaną zachowane) musi być zgodny z typem parametru nietypowy parametr szablonu, z wyjątkiem tego, że kwalifikatory cv są usuwane, i z wyjątkiem przypadków, gdy argument szablonu jest wywnioskowany z tablicy - w tym przypadku dozwolony jest dowolny typ całkowy, nawet bool, chociaż zawsze stałoby się to prawdą:
Jak zawsze, oczywiście, musisz przeczytać kilka razy więcej niż raz, aby zrozumieć, co to znaczy :)
Tak więc pojawia się interesujący wynik.
Nasza pożądana specjalizacja nie jest już wybrana, ale gdyby kompilator został zmuszony do wyboru, byłby to błąd.
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 */
}
uruchom kod
Kolejną interesującą rzeczą jest:
Gdyby nie wywnioskowano argumentu innego niż typ szablonu, nie byłoby żadnych ograniczeń, które wymuszałyby takie same argumenty i typy szablonów.
#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);
}
uruchom kod
vector
z nich wszystkich. Zobacz tutaj