模板类的标准流输出

时间:2013-03-02 12:11:16

标签: c++ templates generics operator-overloading

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

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不起作用,因为对于用于特化的类型可能没有重载的<<运算符。 有没有其他可能实现这一目标?也许标识符必须实现一个纯虚拟类,强制所有标识符重载<<运算符。但这可能吗?

感谢您的帮助。

此致

2 个答案:

答案 0 :(得分:3)

通常要做的就是简单地声明拥有流输出运算符是identifier类型的先决条件。这肯定更多的是使用模板的通用C ++编程的精神,而不是使用纯虚方法进行打印的基类。

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

答案 1 :(得分:1)

您的第一个问题“是否有可能[重载运算符&lt;&lt;]模板”?当然......

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

该声明的定义可以正常使用。

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