打印不同类型成员

时间:2017-05-09 03:27:46

标签: c++ function templates

我想写一个接受许多不同类型的函数,比如说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);


}

这不起作用。那么我怎样才能获得我想要的效果呢。

谢谢!

1 个答案:

答案 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;