как запросить, если (T == int) с шаблоном класса - PullRequest
22 голосов
/ 14 июня 2009

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

, например

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

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

Ответы [ 9 ]

40 голосов
/ 14 июня 2009

Примерно так:

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)
    // ...
}
11 голосов
/ 18 октября 2014

Начиная с C ++ 11 у нас есть std::is_same:

if (std::is_same<T, int>::value) ...

Он реализован аналогично предложенной черте TypeIsInt, предложенной в других ответах но с двумя типами для сравнения.

10 голосов
/ 14 июня 2009

Самое простое, самое общее решение: Просто напишите старую простую перегрузку функции:

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, если вам не нужно.

10 голосов
/ 14 июня 2009

Определите это явно, например .:

template <>
ostream& operator << (ostream &out,Vector<int>& vec)
{
}
9 голосов
/ 14 июня 2009

Самый простой способ - указать специализацию шаблона:

#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;
}
8 голосов
/ 14 июня 2009

Таким образом.

ostream & operator << (ostream &out, Vector<int> const & vec)
{
    // ...
}

Компилятор выберет эту функцию поверх шаблона функции, если вы передадите Vector<int>.

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

6 голосов
/ 14 июня 2009

TypeID никогда не бывает хорошей идеей. Это зависит от RTTI. Кстати вот ваш ответ: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

3 голосов
/ 23 марта 2016

Еще одно решение:

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
0 голосов
/ 14 июня 2009

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...