cout矢量std :: any

Nic*_*mer 3 c++ c++17

我有一个std::vectorstd::any,所有这些都可以通过被印刷<<(例如,仅整型和浮点).我喜欢有类似的东西

#include <experimental/any>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::experimental::any> v;

  v.push_back(1);
  v.push_back(3.14);

  for (const auto& a: v) {
    std::cout << a << std::endl;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为std::any不知道<<:

error: no match for ‘operator<<’
Run Code Online (Sandbox Code Playgroud)

到目前为止,我提出的唯一解决方法是将向量项明确地转换为其中可能包含的任何数据类型,例如,

#include <experimental/any>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::experimental::any> v;

  v.push_back(1);
  v.push_back(3.14);

  for (const auto& a: v) {
    try {
        std::cout << std::experimental::any_cast<int>(a) << std::endl;
    } catch (const std::experimental::fundamentals_v1::bad_any_cast&)
    {}

    try {
        std::cout << std::experimental::any_cast<double>(a) << std::endl;
    } catch (const std::experimental::fundamentals_v1::bad_any_cast&)
    {}
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这可能(可能是不必要的)冗长且相当不灵活,因为一旦必须知道向量中可能出现的所有数据类型.

是否存在vector<any>没有这些缺点的印刷版本?

Nic*_*las 10

您使用的是错误的类型.由于"只有整数和浮点数"存储在这里,那么你明确想要的是一个std::variant<int, float>,而不是一个any.然后你可以vector很容易地打印出这样的东西:

for (const auto& a: v) {
  std::visit([](const auto &val) {std::cout << val << std::endl;}, a);
}
Run Code Online (Sandbox Code Playgroud)

any主要用于通过中介在两个位置之间进行通信,其中起点和终点都知道要使用的确切类型,但中介不知道.想想信号系统; 信号的发送者和接收者知道使用什么类型,但信号系统并不关心.

在较小的固定范围的类型上应用操作是更多的variant领域.在无限范围的类型上应用操作是某种形式的真正多态:编译时(模板)或运行时(virtual函数).