c++ - std::variant 使用整数数组中的元素作为 std::variant 中的目标类型从 std::variant 获取内容

标签 c++ dynamic variant

我有一个整数数组来检索 std::variant 中的内容。但是编译失败,报错No matching function to call 'get' .您能否解释原因,并提出实现相同目的的可行解决方案?

using my_type = std::variant<int, float, bool>;
constexpr int[] expected_types = {2,2,2,2};
 

bool validate(std::vector<my_type> input) {
  bool rst;
  if (input.size() != 4) {
    return false;
  }
  for (int i = 0; i < 4; i++) {
    rst = rst || std::get<my_type[i]>(input[i]);
  }
  return rst;
}

这里有更多的上下文。 A、B、C类都实现了接口(interface)bool foo(std::vector<my_type> input) .但是A类的输入是{int, int, bool}的格式,B类的输入是{int, int, float}的格式,C类的输入是{bool,bool}的格式。每个类中的 expected_types 在输入 vector 中保存自己的类型。然后 std::get 用于访问输入 vector 中的元素。你能建议一个清晰优雅的模式来满足我的情况吗?

非常感谢!

最佳答案

如果我理解你的validate正常运行,它应该验证 vector<variant<int, float, bool>> ...

  1. 对于类型 A 具有正确的长度, BC .
  2. 包含 variant variant 指示的类型A::expected_types[] 中的索引, B::expected_types[]C::expected_types[] .

然后它可以采用正在测试的类型 vector for ( A , BC ) 作为模板参数并使用 variant::index()检查个人的类型variant s 持有 vector .

将它与折叠结合 && (因为你希望所有的都是 true )你会得到:

template<class T>
bool validate(const std::vector<my_type>& input) {
    if (input.size() != std::size(T::expected_types))  return false;

    return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
        // fold over && :
        return (... && (input[Is].index() == T::expected_types[Is]));
    }(std::make_index_sequence<std::size(T::expected_types)>());
}

如果你真的想要std::get expected_types来自 vector并使用逻辑 OR , 这可以用类似的方式完成,但折叠 || :

template <class T>
bool get_bool(const std::vector<my_type>& input) {
    if (not validate<T>(input)) return false; // use the validation function above

    return [&]<std::size_t... Is>(std::index_sequence<Is...>) {
        // fold over ||
        return (... || (std::get<T::expected_types[Is]>(input[Is])));
    }(std::make_index_sequence<std::size(T::expected_types)>());
}

Demo

关于c++ - std::variant 使用整数数组中的元素作为 std::variant 中的目标类型从 std::variant 获取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75281033/

相关文章:

c++ - 检查来自文件的传入数据类型

c++ - 权限被拒绝,正在运行 C++ 程序 bash

c++ - C++中的反射。 C++中如何将函数作为参数传递

javascript - 从 "append(<tr><td="ID 获取 ID">..."

c++ - 如何在没有动态内存分配的情况下创建对象数组

ios - 从字典创建 Swift 对象

c++ - 运算符|| std::variant 的重载

c++ - 从可以容纳 std::string 或 double 的变体返回 std::string

c++ - 在从 std::variant 继承的类上使用 std::visit - libstdc++ vs libc++

c++ - 在 C++ 中设置 array1 = array2