系统能够使用
如果我只在当前位置的
a.type().name()
区分每个元素的类型,但是无法打印它们?#include <iostream>
#include <vector>
#include <any>
#include <string>
#include <algorithm>
template<typename Last>
void addElement(std::vector<std::any>& container, Last last) {
std::cout << "Last = " << last << std::endl;
container.push_back(last);
}
template<typename First, typename... Rest>
void addElement(std::vector<std::any>& container, First first, Rest... rest) {
std::cout << "Elem = " << first << std::endl;
container.push_back(first);
addElement(container, rest...);
}
template<typename... Ts>
std::vector<std::any> createAnyVector(Ts... ts) {
std::vector<std::any> container;
addElement(container, ts...);
return container;
}
int main() {
std::cout << "ANYVECTOR" << std::endl;
std::vector<std::any> container = createAnyVector("Hello", 3.14, 'A', true, 42);
std::cout << "Number of elements in container = " << container.size() << std::endl; // 5 correct.
for (const auto& a : container) {
std::cout << a.type().name() << ", " << "HERE?" << std::endl;
}
}
如果我只在当前位置的
HERE?
处写入a
,那么它会返回错误:No operator << matches these operands
operand types are: std::basic_ostream<char, std::char_traits<char>> << const << std::any
std::any
定义operator<<
,这是正确的。std::any :: type()
返回运行时分配给std::any
的任何类型的RTTI的std::type_info&
,但是operator<<
必须在编译时知道。 您是否希望std::any
定义一个operator<<
来处理可能分配给它的每种可能类型? 这是不可能的。 - Remy Lebeaustd::variant
这样的标签式联合会更容易实现。就像 Remy 说的那样。 - Swift - Friday Piestd::variant
。 - Quimbystd::any
可能会让您茅塞顿开,了解为什么会出现这种情况,以及为获得此功能所需付出的代价。此外,在C++中,std::any
几乎总是错误的。 - Passer By