template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
Anda harus menggunakan std::size_t
bukan int
.
lari kesini
Sunting:
Sebenarnya, komentar dan intuisi saya tentang kode membuat saya menggali topik. Pada pandangan pertama, pengembang standar (seperti saya) mengharapkan kompiler untuk dikonversi int
ke std::size_t
(karena mereka adalah tipe integral dan secara implisit mengkonversi sangat sepele) dan memilih void foo(std::vector<std::array<T1, SIZE>> bar)
spesialisasi terbaik. Jadi ketika membaca halaman pengurangan argumen template saya menemukan ini:
Jika parameter templat non-tipe digunakan dalam daftar parameter, dan argumen templat yang sesuai dideduksi, jenis argumen templat yang dideduksi (sebagaimana ditentukan dalam daftar parameter templat terlampir, makna referensi dipertahankan) harus cocok dengan jenis parameter template non-tipe persis, kecuali bahwa cv-kualifikasi dijatuhkan, dan kecuali di mana argumen template disimpulkan dari suatu array array-dalam hal itu tipe integral apa pun diperbolehkan, meskipun bool meskipun itu selalu menjadi benar:
Seperti biasa, tentu saja, Anda harus membaca beberapa kali lebih banyak dari sekali untuk memahami artinya :)
Jadi hasil yang menarik keluar.
Sudah spesialisasi yang kami inginkan tidak dipilih tetapi jika kompiler terpaksa memilih, itu akan menjadi kesalahan.
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 */
}
jalankan kode
Hal menarik lainnya adalah:
Jika argumen templat non-tipe tidak dideduksi, tidak akan ada batasan yang memaksa argumen dan tipe templat sama.
#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);
}
jalankan kode
vector
pada semuanya. Lihat di sini