【问题标题】:C++ - Stream/cout for a variant of the form <int, pair<char,char>>C++ - <int, pair<char,char>> 形式的变体的 Stream/cout
【发布时间】:2021-06-11 16:53:26
【问题描述】:

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

鉴于std::variant&lt;int,std::pair&lt;char, char&gt;&gt; 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).

我用于流式传输变体的任何 sn-p,例如

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&lt;char&gt;') and 'const std::__1::pair&lt;char, char&gt;')" 错误 --- 无论我尝试什么,这就是我得到的全部!

我无法弄清楚这段代码有什么问题。请问有人可以帮我找出并解决这里的问题吗?

boost 等第三方库是绝对不行的。

【问题讨论】:

    标签: c++ stream c++17 cout std-variant


    【解决方案1】:

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

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

    所以,正确的解决方法是使第二个参数const

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

    这应该很明显,因为实际变体的 operator&lt;&lt; 是 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)
    

    【讨论】:

    • 太棒了,非常感谢您 --- 我不得不承认错误消息的 const 部分从我身边飞过 --- 猜我太沮丧了,无法清醒地看到...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多