如何在不知道类型的情况下为 input/output 编写 C++ 运算符重载

How to write a c++ operator overload for input/output without knowing the type when using it

我做了一个运算符:

template <typename Container>
std::ostream& operator << (std::ostream& out, const Container& container) {
string result = "{";

out << result;

return out;
}

我想用的时候:

enum class space { empty, full, half };
using elements_t = vector<space>;

int main(int argc, char** argv)
{
    elements_t elems = { space::half };
    cout << elems;
    return 0;
}

它抛出一个错误:

'operator <<'有歧义。

如何指定要使用自定义的?我知道使用模板函数之后你会在 <> 中分配类型,如果我有一个特定的 class/struct 我可以让运算符成为本地或朋友,但是如果我希望它是全局的呢?

如果我尝试你的程序,编译器会抱怨 operator<<() inside 你的自定义运算符定义(最好复制包括行号在内的确切错误消息)。我想你想在这里使用 std::operator<< (重复会导致无限递归)。要做到这一点,你就是这样写的:

template <typename Container>
std::ostream& operator << (std::ostream& out, const Container& container) {
    std::string result = "{";

    std::operator<<(out, result);
    return out;
}