当我在模板类中编写函数时,如何找出我的T是什么?
e.g。
template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
if (typename T == int)
}
如何编写上述if语句以使其有效?
答案 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;