Как запросить if (T == int) с классом шаблона
Когда я пишу функцию в классе шаблона, как я могу узнать, что такое мой T?
например.
template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
if (typename T == int)
}
Как я могу написать приведенный выше оператор if, чтобы он работал?
Ответы
Ответ 1
Что-то вроде этого:
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)
// ...
}
Ответ 2
Определите это явно, например:
template <>
ostream& operator << (ostream &out,Vector<int>& vec)
{
}
Ответ 3
Самое простое, наиболее общее решение:
Просто напишите простую старую перегрузку функции:
ostream& operator << (ostream &out,Vector<int>& vec)
{
// Your int-specific implementation goes here
}
Это предполагает, что версии int
и не int
не имеют большого количества общего кода, так как вам нужно написать две отдельные реализации.
ЕСЛИ вы хотите использовать одну общую реализацию функции, только с выражением if
внутри, которое отличается, используйте реализацию Charles Bailey:
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
, если вам это не нужно.
Ответ 4
Самый простой способ - предоставить специализацию шаблона:
#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;
}
Ответ 5
Таким образом.
ostream & operator << (ostream &out, Vector<int> const & vec)
{
// ...
}
Компилятор выберет эту функцию над шаблоном функции, если вы пройдете Vector<int>
.
Изменить: я нашел эту статью, которая пытается объяснить, почему предпочесть перегрузку специализации шаблонов.
Ответ 6
TypeID никогда не является хорошей идеей. Он полагается на RTTI.
Кстати, вот ваш ответ: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7
Ответ 7
Так как С++ 11 имеет std::is_same
:
if (std::is_same<T, int>::value) ...
Он реализован аналогично предложенному признаку TypeIsInt
, предложенному в других ответах,
но с двумя типами, которые нужно сравнить.
Ответ 8
Еще одно решение:
if(std::is_same<T, int>::value)
//It is int
if (std::is_same<T, double>::value)
//It is double
if (std::is_same<T, long double>::value)
//It is long double
Ответ 9
Шаблоны С++ не работают таким образом. Общая идея шаблонов - это выраженные вещи, общие для множества разных типов. И в вашем случае вы должны использовать специализированную специализацию.
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
}
Тогда компилятор С++ вызовет эту функцию, когда вы используете тип int и общую реализацию для любого другого типа
std::vector<int> f(5, 5);
std::cout << f;