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
我都不喜欢。还有其他方法吗?
答案 0 :(得分:1)
在名称空间std
中添加内容是 U 未定义 B 行为。
即使合法,也不能在外部名称空间中添加内容。但这仍然无法解决您的ADL问题(template <typename T> std::ostream &operator<<(std::ostream&, const std::vector<T>&);
仅对ADL使用std
(对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);
答案 1 :(得分:0)
您只能为特定类型覆盖operator<<
template<typename ...Args>
std::ostream &operator <<(std::ostream &out, boost::variant<std::vector<int>, Args...> t);