我想写一个接受许多不同类型的函数,比如说double和complex。我也想打印他们的成员,比如当类型是double时打印double值,当这种类型很复杂时打印实部和虚部。
如果我使用模板,则会出现错误,因为double不能包含实部和虚部。
说
template<class T>
void univ_print(T t)
{
if(typeid(T)==typeid(double))
printf("%f\n",t);
else if(typeid(T)==typeid(complex))
printf("%f\t%f\n",t.real, t.imag);
}
这不起作用。那么我怎样才能获得我想要的效果呢。
谢谢!
答案 0 :(得分:1)
模板对于类型共享接口的情况更有用
template<typename T>
T sum(T a, T b)
{
return a + b;
}
在这里,我们正在创建sum
函数,该函数接受包含基元operator+
的所有类型,包括基元。
现在,如果有几种类型不共享接口,那么您需要做的是为它们进行专门化/过载。碰巧,重载功能模板often superior为专业化。
将输出函数添加到自定义类型的(几乎标准的)方法是为流重载operator<<
。
class Complex
{
double real, imag;
friend std::ostream& operator<<(std::ostream& os, const Complex& c)
{
return os << c.real << '\t' << c.imag;
}
// public methods...
};
然后你可以写
Complex c;
std::cout << c << std::endl;