c++ - std::any 的 cout vector

标签 c++ c++17

<分区>

我有一个 std::vectorstd::any , 所有这些都可以通过 << 打印(例如,只有整数和 float )。我很想拥有类似的东西

#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;
}

但是自std::any 之后就没有用了不知道<< :

error: no match for ‘operator<<’

到目前为止,我想出的唯一解决方法是将 vector 项显式转换为其中可能存在的任何数据类型,例如,

#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;
}

这(也许是不必要的)冗长而且相当不灵活,因为 once 必须知道 vector 中可能出现的所有数据类型。

有没有vector<any>的变种?打印没有这些缺点?

最佳答案

您使用了错误的类型。由于“只有整数和 float ”存储在这里,那么你显然想要的是 std::variant<int, float> ,不是 any .然后你可以打印这样一个 vector很容易:

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

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

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

关于c++ - std::any 的 cout vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864139/

相关文章:

c++ - 根据属性值删除结构 vector 中的元素

c++ - CMake:替换接口(interface)目标的编译标志

c++ - 光线追踪:转换问题

c++ - 重置 cin 流状态 C++

c++ - 自动模板参数可以传什么有限制吗?

c++ - 为什么 C++ 不尝试使用第二个模板重载?

c++ - 下一代 std::tie

c++ - 使用复杂类型断言 std::holds_alternative 无法编译

c++ - 在连续内存中存储相同长度的字符串?

c++ - 使用 freetype 测试字体文件