Подтвердить что ты не робот

Как запросить if (T == int) с классом шаблона

Когда я пишу функцию в классе шаблона, как я могу узнать, что такое мой T?

например.

template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
if (typename T == int)
}

Как я могу написать приведенный выше оператор if, чтобы он работал?

4b9b3361

Ответ 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>.

Изменить: я нашел эту статью, которая пытается объяснить, почему предпочесть перегрузку специализации шаблонов.

Ответ 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;