2

我已经尝试了在流式传输变体内容时可以找到的每个片段,但在我的特定用例中似乎没有任何效果:

给定一种形式的变体,std::variant<int,std::pair<char, char>> myVar如何在myVar不明确知道myVar包含什么的情况下流式传输内容。

例如:

#include <iostream>
#include <variant>

typedef std::variant<int,std::pair<char, char>> myVar;

template <typename T>
std::ostream& operator<<(std::ostream& os, std::pair<T, T> &p) {
    os << "(" << p.first << ", " << p.second << ")";
    return os;
} // This is so we can stream a pair...

/*
...black box to stream variant here...
*/

std::pair<char, char> testPair = {'X','a'};
int testInt = 5;
myVar testVariant = testInt;

std::cout << testVariant << "\n" // Should print 5.

testVariant = testPair;

std::cout << testVariant << "\n" // Should print (X, a).

我用于流式传输变体的任何片段,例如

template<typename T, typename... Ts>
std::ostream& operator<<(std::ostream& os, const std::variant<T, Ts...>& v)
{
    std::visit([&os](auto&& arg) {
        os << arg;
    }, v);
    return os;
}

在这种情况下它会失败并返回以下错误消息:

"Invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'const std::__1::pair<char, char>')"错误---无论我尝试什么,这都是我得到的!

我无法弄清楚这段代码有什么问题。请问有人可以帮我在这里识别和解决问题吗?

像 boost 这样的第三方库是绝对不行的。

4

1 回答 1

1

您的代码(几乎)很好,但不是 const 正确的。流输出运算符应接受该值作为const引用。你的不是。

虽然模板类型不匹配的错误消息可能难以阅读,但它们通常会告诉您问题所在。在这种情况下,您会看到它正在尝试匹配const类型,并且候选者是非常量的。

因此,正确的解决方法是制作第二个参数const

template <typename T>
std::ostream& operator<<(std::ostream& os, const std::pair<T, T> &p) //...

这应该很明显,因为您operator<<的实际变体是 const。这意味着不可能从它包含的任何内容中获取非常量引用。

这是完整的工作程序,带有修复程序以及您错过的一些分号。

#include <iostream>
#include <variant>

typedef std::variant<int,std::pair<char, char>> myVar;

template <typename T>
std::ostream& operator<<(std::ostream& os, const std::pair<T, T> &p)
{
    os << "(" << p.first << ", " << p.second << ")";
    return os;
}

template<typename T, typename... Ts>
std::ostream& operator<<(std::ostream& os, const std::variant<T, Ts...>& v)
{
    std::visit([&os](auto&& arg) { os << arg; }, v);
    return os;
}

int main()
{
    std::pair<char, char> testPair = {'X','a'};
    int testInt = 5;
    myVar testVariant = testInt;
    std::cout << testVariant << "\n";
    testVariant = testPair;
    std::cout << testVariant << "\n";
}

输出:

5
(X, a)
于 2021-03-14T04:00:34.410 回答