1

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

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)应该执行一致性检查并写入警告std::cout,以防请求的元素不存在于data_map_. 简单地将 id 传递给 cout 是行不通的,因为<<用于特化的类型可能没有重载运算符。还有其他可能实现这一目标吗?也许标识符必须实现一个纯虚拟类,该类强制所有标识符重载<<运算符。但这可能吗?

谢谢你的帮助。

问候

4

2 回答 2

3

通常要做的事情是简单地声明具有流输出运算符是该identifier类型的先决条件。与使用纯虚拟方法打印的基类相比,这肯定更符合使用模板进行通用 C++ 编程的精神。

如果必须,如果没有特定类型的流输出运算符,也许您可​​以使用 SFINAE 打印简单的“不可用”消息。

于 2013-03-02T12:14:27.960 回答
1

您的第一个问题“是否有可能 [overload operator<<] for templates”?当然...

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

该声明的定义可以正常工作。

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

于 2013-03-02T12:16:04.773 回答