C++ - Stream/cout 形式的变体 <int, pair<char,char>>
C++ - Stream/cout for a variant of the form <int, pair<char,char>>
我已经尝试了我能找到的关于流式传输变体内容的所有片段,但在我的特定用例中似乎没有任何效果:
给定形式 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>')"
错误 --- 无论我尝试什么,这都是我得到的!
我不知道这段代码有什么问题。有人可以帮我找出并解决这里的问题吗?
第 3 方库(例如 boost)是绝对不可取的。
您的代码(几乎)没问题,但常量不正确。流输出运算符应该接受该值作为 const 引用。你的不是。
虽然模板类型不匹配的错误消息可能难以阅读,但它们通常会告诉您问题所在。在这种情况下,您会看到它正在尝试匹配 const
类型,并且候选者是非常量。
因此,正确的解决方法是使第二个参数 const
:
template <typename T>
std::ostream& operator<<(std::ostream& os, const std::pair<T, T> &p) //...
这应该很明显,因为您的 operator<<
实际变体是常量。这意味着不可能从它包含的任何内容中获得非常量引用。
这是完整的工作程序,其中包含修复程序以及您遗漏的一些分号。
#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)
我已经尝试了我能找到的关于流式传输变体内容的所有片段,但在我的特定用例中似乎没有任何效果:
给定形式 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>')"
错误 --- 无论我尝试什么,这都是我得到的!
我不知道这段代码有什么问题。有人可以帮我找出并解决这里的问题吗?
第 3 方库(例如 boost)是绝对不可取的。
您的代码(几乎)没问题,但常量不正确。流输出运算符应该接受该值作为 const 引用。你的不是。
虽然模板类型不匹配的错误消息可能难以阅读,但它们通常会告诉您问题所在。在这种情况下,您会看到它正在尝试匹配 const
类型,并且候选者是非常量。
因此,正确的解决方法是使第二个参数 const
:
template <typename T>
std::ostream& operator<<(std::ostream& os, const std::pair<T, T> &p) //...
这应该很明显,因为您的 operator<<
实际变体是常量。这意味着不可能从它包含的任何内容中获得非常量引用。
这是完整的工作程序,其中包含修复程序以及您遗漏的一些分号。
#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)