【问题标题】:A function that prints different types' members打印不同类型成员的函数
【发布时间】:2017-05-09 03:27:46
【问题描述】:

我想写一个函数来接受许多不同的类型,比如双重和复杂。我还想打印他们的成员,比如当类型为 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);


}

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

谢谢!

【问题讨论】:

  • 您可以为不同的类型重载univ_print(),而不是使用模板。 (例如,有univ_float(double)univ_float(complex)。)只有当你有一堆类型可以被相同或大部分相同的类型时,模板才真正起作用,不同之处专门使用特征和/或特定的重载。您实际上想在这里实现什么目标?
  • @cdhowie:好主意,谢谢!这就是我想要的。
  • 您到底为什么要使用printf,而basic_ostream::operator&lt;&lt; 已经为您想要显示的大多数类型定义了。任何额外的要求都可以通过专门的univ_print来处理。
  • 您可以使用重载或模板特化

标签: c++ function templates


【解决方案1】:

模板对于类型共享接口的情况更有用

template<typename T>
T sum(T a, T b)
{
    return a + b;
}

在这里,我们正在创建sum 函数,它接受具有接口operator+ 的所有类型,其中包括原语。

现在,如果几种类型不共享一个接口,您需要做的是为它们专门化/重载。碰巧,重载函数模板是often superior 专门化。

将输出函数添加到自定义类型的(几乎标准)方法是为流重载operator&lt;&lt;

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    相关资源
    最近更新 更多