gpt4 book ai didi

C++:检查存储在 std::any 中的值是否是整数

转载 作者:行者123 更新时间:2023-12-03 15:47:50 25 4
gpt4 key购买 nike

std::any 中存储了一个值我想知道它是整数值(charshortintlong,有符号和无符号)还是浮点值(floatdouble)或其他.
如果我只需要检查 int值,我会这样做:

std::any a;
if (a.type() == typeid(int)) {
// do some logic for int
}
但要做一个巨人 if (a.type() == typeid(int) || a.type() == typeid(signed char)...)对于 C++ 中的所有整数类型似乎......不好。
我可以使用 is_arithmetic<T>来自 type_traits如果我有类型 T以某种方式访问​​,但我没有,我只有 std::any#type()返回 std::type_info .
有没有办法在 if健康)状况?
(如果重要,我使用 C++20)

最佳答案

std::any是一个类型删除类。
它只记住确切的类型,以及转换回该确切类型的能力(以及如何复制/移动/销毁它)。
如果您想记住有关存储类型的其他事实,您必须自己完成这项工作。
没有办法到达Tstd::any 内不检查确切的T .
一般来说,使用 std::any在没有控制的情况下将“任何东西”插入其中会导致一团糟。 std::any允许您使用一组“开放”类型来执行此操作,因此您可以安全地将数据从一个代码点传递到另一个代码点,而中间代码不需要知道它是什么。
它不能让您使用未知类型生成类型感知代码。

为了解决您的问题,有多种解决方案。

  • 如果您支持的类型集已关闭(以某种方式修复),请使用 std::variant .
  • 如果类型集大部分是封闭的,请使用 std::variant< bunch, of, types, std::any > .然后您可以将“大部分关闭”的类型处理为 variant .使用阻止转换为 std::any 的代码如果类型输入可以转换为任何其他类型可能是明智的。
  • 如果您愿意编写自己的类型删除,您可以编写自己的或扩充 std::any有额外的信息。
  • 您可以编写一个实用函数来执行大量 if 语句,可能使用模板,在时间上与类型数量成线性关系。

  • 对于 1/2,
    auto is_integral_f = [](auto&& x){ return std::is_integral<std::decay_t<decltype(x)>>{}; };

    std::variant<int,char,unsigned int, long, double, std::any> bob;
    bob = 3;
    assert( std::visit( is_integral_f, bob ) );
    3, here is an example一种使类型删除更简单的引擎;自己写是可以的。然后我们简单地:
    auto is_integral = any_method<bool()>{ is_integral_f };

    super_any<decltype(is_integral)> my_any;

    my_any bob = 3;
    my_any alice = 3.14;
    assert( (bob->*is_integral)() );
    assert( !(alice->*is_integral)() );
    对于 4,
    template<class...Ts>
    bool is_any_of_types( std::any const& a ) {
    return (( a.type() == typeid(Ts) ) || ... );
    }
    sizeof...(Ts) 中是线性的.
    如果 Ts...很大,但我怀疑它会变得足够大。您仍然需要自己枚举类型; is_integral<T>不能被 C++ 语言反转。

    关于C++:检查存储在 std::any 中的值是否是整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67253396/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com