boost::variant
为自己实现一个流运算符。 问题是没有用于std::vector<>
- 但boost::variant
假设传递给boost::variant
的每个类型都有一个实现。那么在哪里实现这个运算符呢?最好在某个命名空间中,它不会与其他人实现冲突。 据我了解,人们可以实施
template<typename T>
std::ostream &operator<<(std::ostream&, const std::vector<T>&);
在 std
命名空间或从中调用 std::vector
的流式处理运算符的命名空间中 - 在本例中为 boost::detail::variant
我也不喜欢。还有其他方法吗?
在命名空间中添加内容 std
是 Undefined Behavior。
在外部命名空间中添加东西是不行的,即使合法。 但它无论如何都不能解决您的 ADL 问题(template <typename T> std::ostream &operator<<(std::ostream&, const std::vector<T>&);
只将 std
用于 ADL(以及命名空间用于T
((
脆弱的修复是将其放在全局命名空间中,但是您必须在提升operator <<
定义之前包含它:-/
作为替代方法,您可以使用常规方式来处理variant
并使用访问者:
struct Printer
{
template <typename T>
void operator() (const T& e) const { std::cout << e; }
template <typename T>
void operator() (const std::vector<T>& v) const
{
// Your implementation, such as
for (const auto& e : v) {
std::cout << e << std::endl;
}
}
};
boost::visit(Printer{}, my_variant);
您只能覆盖特定类型的operator<<
template<typename ...Args>
std::ostream &operator <<(std::ostream &out, boost::variant<std::vector<int>, Args...> t);