如何确定c ++中的当前流类型?

时间:2011-11-07 12:52:45

标签: c++

我在c ++中使用模板,并且我将流对象作为模板化参数传递。如何在运行时知道当前的流类型?

2 个答案:

答案 0 :(得分:1)

模板是一个编译时构造,所以“在运行时”没有任何关系。但那甚至更好。可能最惯用的方法是使用char_traits

template <typename TChar, typename Traits>
void foo(std::basic_ostream<TChar, Traits> & o)
{
  // use `Traits` in here
  // e.g. Traits::char_type
}

答案 1 :(得分:0)

你可以:

  • 尝试使用dynamic_cast&lt;&gt;您可能感兴趣的可能的流类型,并查看哪些成功
  • 使用typeid并与已知类型进行比较
  • 要求模板的用户传递一个附加参数,说明流类型是什么
  • 为需要不同处理的特定流类型提供模板专业化

然而,所有这些都是限制性的 - 它们都要求您了解不同的流类型,如果它们中的任何一个需要在模板化类中进行特殊处理,您可能会在以后发现需要添加另一个,另一个...理想情况下,模板应该比这更普遍。

由于标准库中的流类都派生自一个共同的祖先,另一个选择是不使用模板,而是在提供所需功能并依赖多态的级别接受指向祖先类型的指针或引用。同样,如果需要,这可以使用重载来专门针对特定类型。