Bunu yapabilirsiniz:
template <typename T, unsigned int N>
std::ostream & operator<<(std::ostream & os, const T (&arr)[N])
{
// ..
return os;
}
Bu elbette, derleme zamanı diziler için çalışır. T
std
ad alanında yerleşik bir tür veya bir tür olduğunda bu şablonu başlatmanıza izin verilmediğini unutmayın!
Mümkünse bu satır içi yapmak en iyisidir, çünkü her N
için ayrı bir örneğe neden olursunuz. (pretty printer bu bir örnek vardır.) os << "Hello"
şimdi iki olası aşırı yükleme vardır, çünkü battaniye şablon bir belirsizliği yaratır, ancak, göreceksiniz
: const char (&)[6]
eşleşen şablonu ve (non-şablon) aşırı için her ikisi de aynı dönüşüm sekanslarına sahip olan bozunma-işaretçisi const char *
. Aslında o ışığında
template <typename T, unsigned int N, typename CTy, typename CTr>
typename std::enable_if<!std::is_same<T, char>::value,
std::basic_ostream<CTy, CTr> &>::type
operator<<(std::basic_ostream<CTy, CTr> & os, const T (&arr)[N])
{
// ..
return os;
}
:
#include <ostream>
#include <type_traits>
template <typename T, unsigned int N>
typename std::enable_if<!std::is_same<T, char>::value, std::ostream &>::type
operator<<(std::ostream & os, const T (&arr)[N])
{
// ..
return os;
}
Aslında, ayrıca basic_ostream
parametreleri şablon parametrelerini yapabilirsiniz hatta daha genel olarak: Biz char dizileri için aşırı devre dışı bırakarak bu çözebilirsiniz T
kullanıcı tanımlı bir tür olmalı, is_fundamental<T>
ile is_same<T, char>
ve hatta daha fazla denetim almak için değiştirebilirsiniz (ancak kullanıcılar standart kitaplık türlerinin dizileri için bunu kullanmamalıdır).
sayesinde (vb, öbek üzerinde tahsis, yani diziler), ama Don Aynı zamanda dinamik diziler için çalışacak olan bu yöntemle
Bir artı: Sonra aşağıdaki gibi kullanabiliriz Inline uygulanmadığı takdirde neden her N için ayrı bir örneğe neden sebep olduğunu anlayamıyorum? – Alcott
Eh, bu bir şablon, bu yüzden her şablon örneği, ikili dosyanızda ayrı bir işlev olarak bitebilir. Eğer satır içi iseniz, fonksiyon çağrısından tamamen kaçınabilirsiniz, ancak bu sonuç derleyiciye bağlıdır. –
anladı.Bu işleçle, 2, 2 tane şablona sahip, ikinci argüm N'yi nasıl belirleyebilirim? Görünüşe göre sadece "cout << ar;" kullanamıyorum, yapabilir miyim? – Alcott