要将对象写入命令行(或其他输出流),可能会使<<
运算符重载。但有没有可能为模板实现这一目标?
假设我有以下内容:
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不起作用,因为对于用于特化的类型可能没有重载的<<
运算符。
有没有其他可能实现这一目标?也许标识符必须实现一个纯虚拟类,强制所有标识符重载<<
运算符。但这可能吗?
感谢您的帮助。
此致
答案 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<<
,但不要过于广泛地公开它。