模板类的标准流输出

Standard stream output for template classes

本文关键字:输出 标准      更新时间:2023-10-16

要将对象写入命令行(或其他输出流),可以重载<<操作符。但是是否有可能为模板实现这一点?假设我有以下内容:

template <typename identifier>
class SomeTemplate {
public:
  SomeTemplate();
  ~SomeTemplate();
  void addElement(identifier id, unsigned int elem);
  unsigend int getElement(identifier id);
private:
  std::map<identifier, unsigned int> data_map_;
};

当我现在专门化类时,例如std::tuple<unsigned int, unsigned int, unsigned int>类型的标识符,函数getElement(identifier id)应该执行一致性检查,并在data_map_中不存在请求元素的情况下向std::cout写警告。简单地将id传递给cout是不行的,因为可能没有用于专门化的类型重载的<<操作符。有没有其他的方法来实现这个目标?也许标识符必须实现一个纯虚类,强制所有标识符重载<<操作符。但这可能吗?

谢谢你的帮助。

通常要做的事情是简单地声明具有流输出操作符是identifier类型的先决条件。这无疑更符合使用模板的泛型c++编程的精神,而不是一个带有纯虚方法打印的基类。

如果你必须,也许你可以使用SFINAE打印一个简单的"unavailable"消息,如果没有特定类型的流输出操作符

您的第一个问题"是否有可能为模板[重载操作符<<]"?当然…

template <typename identifier>
std::ostream& operator<<(std::ostream& out, SomeTemplate<identifier> const& rhs);

为该声明定义一个定义就可以了。

然而,你真正要问的是,我可以流std::tuple吗?答案似乎是否定的。当然,您可以为它编写一个本地operator<<,但不要太广泛地公开它。