template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
Bunun std::size_tyerine kullanmalısınız int.
buraya koş
Edit:
Aslında, senin yorum ve kod hakkındaki sezgi beni konuya kazmak için yol açtı. İlk bakışta, (benim gibi) standart geliştirici dönüştürmek için derleyici beklemek intiçin std::size_t(her ikisi de ayrılmaz türüdür ve dolaylı dönüştürme çok önemsiz olduğu için) ve açılan menüden void foo(std::vector<std::array<T1, SIZE>> bar)iyi uzmanlaşma olarak. Yani şablon argüman kesinti sayfasını okurken bunu buldum:
Parametre listesinde tür olmayan bir şablon parametresi kullanılırsa ve karşılık gelen şablon bağımsız değişkeni çıkarılırsa, çıkarılan şablon bağımsız değişkeninin türü (ekteki şablon parametre listesinde belirtildiği gibi, anlam referansları korunur) türüyle eşleşmelidir cv niteleyicilerinin bırakılması ve şablon bağımsız değişkeninin bağlı bir diziden çıkarılması haricinde tam olarak tür olmayan şablon parametresi - bu durumda herhangi bir integral türüne izin verilir, hatta her zaman doğru olacak olsa bile bool:
Her zaman olduğu gibi, elbette, bunun ne anlama geldiğini anlamak için bir kereden fazla okumak zorundasınız :)
Böylece ilginç bir sonuç ortaya çıkıyor.
Zaten istediğimiz uzmanlık seçilmedi, ancak derleyici seçmek zorunda kalsaydı, bir hata olurdu.
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 */
}
kodu çalıştır
Bir başka ilginç şey:
Tür olmayan şablon bağımsız değişkeni çıkarılmasaydı, bağımsız değişken ve şablon türlerini aynı olmaya zorlayan bir kısıtlama olmazdı.
#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);
}
kodu çalıştır
vectorhepsini dıştan kaldırarak basitleştirebilirsiniz . Buraya bakın