如何用模板类查询if(T == int)

时间:2009-06-14 08:55:42

标签: c++ templates

当我在模板类中编写函数时,如何找出我的T是什么?

e.g。

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

如何编写上述if语句以使其有效?

9 个答案:

答案 0 :(得分:40)

这样的事情:

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)
    // ...
}

答案 1 :(得分:11)

从C ++ 11开始,我们有std::is_same

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

它的实现类似于其他答案中建议的特征TypeIsInt, 但有两种类型需要比较。

答案 2 :(得分:10)

明确定义,例如:

template <>
ostream& operator << (ostream &out,Vector<int>& vec)
{
}

答案 3 :(得分:10)

最简单,最通用的解决方案: 只需编写函数的简单旧重载:

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 :(得分:9)

最简单的方法是提供模板专业化:

#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 :(得分:8)

这样。

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

如果您传递Vector<int>

,编译器将在功能模板上选择此功能

编辑:我找到了this article,它试图解释为什么更喜欢重载到模板专业化。

答案 6 :(得分:6)

TypeID永远不是一个好主意。它依赖于RTTI。 顺便说一句,这是你的答案:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

答案 7 :(得分:3)

另一个解决方案是:

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

答案 8 :(得分:0)

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
}

当您对任何其他类型

使用int类型和一般实现时,C ++编译器将调用此函数
std::vector<int> f(5, 5);
std::cout << f;