-z (что-то) означает, что (что-то) равно NULL, тогда верните true
http://unixhelp.ed.ac.uk/CGI/man-cgi?test
предполагает, что нулевая длина также возвращает true, я бы посоветовал выполнить «man test» на вашей машине, чтобы проверить точную формулировку в вашей системе.
Примерно так:
template< class T >
struct TypeIsInt
{
static const bool value = false;
};
template<>
struct TypeIsInt< int >
{
static const bool value = true;
};
template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
if (TypeIsInt< T >::value)
// ...
}
Определите его явно, например:
template <>
ostream& operator << (ostream &out,Vector<int>& vec)
{
}
Простейшее и наиболее общее решение: Просто напишите простую старую перегрузку функции:
ostream& operator << (ostream &out,Vector<int>& vec)
{
// Your int-specific implementation goes here
}
Предполагается, что версии int
и не int
не имеют большого общего кода, так как вам нужно написать два отдельные реализации.
ЕСЛИ вы хотите использовать одну общую реализацию функции, только с оператором if
внутри, который отличается, используйте реализацию Чарльза Бейли:
template< class T >
struct TypeIsInt
{
static const bool value = false;
};
template<>
struct TypeIsInt< int >
{
static const bool value = true;
};
template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
if (TypeIsInt< T >::value) {
// your int-specific code here
}
}
В общем, не используйте typeid
, если вам это не нужно.
Самый простой способ - указать специализацию шаблона:
#include <iostream>
#include <vector>
using namespace std;
template <typename T> struct A {
};
template <typename T >
ostream & operator <<( ostream & os, A<T> & a ) {
return os << "not an int" << endl;
}
template <>
ostream & operator <<( ostream & os, A<int> & a ) {
return os << "an int" << endl;
}
int main() {
A <double> ad;
cout << ad;
A <int> ai;
cout << ai;
}
Таким образом.
ostream & operator << (ostream &out, Vector<int> const & vec)
{
// ...
}
Компилятор выберет эту функцию вместо шаблона функции, если вы передадите Vector
.
Изменить: я нашел эта статья , в которой делается попытка объяснить, почему следует предпочесть перегрузку специализации шаблона.
TypeID никогда не подходит идея. Он полагается на RTTI. Кстати, вот ваш ответ: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7
Шаблоны C ++ так не работают. Общая идея шаблонов - это выразить что-то, что характерно для множества разных типов. И в вашем случае вы должны использовать специализацию шаблона.
template<class T> ostream& operator<< (ostream& out, const vector<T>& v)
{
// your general code for all type
}
// specialized template
template<> ostream& operator<< <int>(ostream& out, const vector<int>& vec)
{
// your specific to iny type code goes here
}
Тогда компилятор C ++ вызовет эту функцию, когда вы используете тип int и общую реализацию для любого другого типа
std::vector<int> f(5, 5);
std::cout << f;