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

如何确定c+中的当前流类型+;? 我在C++中使用模板,我将流对象作为模板化的参数传递。如何在运行时知道当前流类型?,c++,C++,您可以: 尝试将动态_转换为您感兴趣的可能流类型,并查看哪些成功 使用typeid并与已知类型进行比较 要求模板的用户传递一个附加参数,说明流类型是什么 为需要不同处理的特定流类型提供模板专业化 然而,所有这些都是限制性的-它们都要求您了解不同的流类型,如果其中任何一个需要在模板类中进行特殊处理,您可能会在以后发现需要添加另一个流类型,以及另一个。。。理想情况下,模板应该比这更通用 由于标准库中的流类都派生自一个公共祖先,因此另一个选项是不使用模板,而是在提供所需功能并依赖多态性的级别上接受

您可以:

  • 尝试将动态_转换为您感兴趣的可能流类型,并查看哪些成功
  • 使用typeid并与已知类型进行比较
  • 要求模板的用户传递一个附加参数,说明流类型是什么
  • 为需要不同处理的特定流类型提供模板专业化
然而,所有这些都是限制性的-它们都要求您了解不同的流类型,如果其中任何一个需要在模板类中进行特殊处理,您可能会在以后发现需要添加另一个流类型,以及另一个。。。理想情况下,模板应该比这更通用


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

模板是编译时构造,因此“在运行时”无需执行任何操作。但那更好。可能最惯用的方法是使用
char\u traits

template <typename TChar, typename Traits>
void foo(std::basic_ostream<TChar, Traits> & o)
{
  // use `Traits` in here
  // e.g. Traits::char_type
}
模板
void foo(标准::基本团队与组织)
{
//在这里使用'Traits'
//例如:特征::字符类型
}

显示代码并准确解释您试图实现的目标。某些编译器还可能使用
typeid
关键字。另一种方法是:
typeid
是标准的,
typeof
是扩展。我不知道约阿希姆是否注意到了这一点,并且在开玩笑。。。