标签: stdany

`auto` 和 `std::any` 有什么区别?

我最近遇到了std::any在 C++17 中引入的基于boost::any. 这个类可以“持有任何类型的实例”和auto自动推导出变量的数据类型。

那么主要的区别是什么?优缺点都有什么?

c++ auto c++17 stdany

5
推荐指数
1
解决办法
406
查看次数

为什么 std::any 实现使用 typeid?

即使使用 -fno-rtti 编译,它似乎在 GCC 和 Clang 中std::any 也能正常工作。

在查看 libc++ 源代码时,我发现他们只是使用了一个简单的技巧:

它们获取以任何类型为模板的变量的地址,这就是它们获取唯一 ID 的方式。

但此代码仅在没有打开 RTTI 时才有效。

这让我想知道。他们为什么首先使用 RTTI?为什么不总是使用这个解决方案呢?我不知道为什么typeid比简单的指针(指向每个类型实例化的静态变量)比较更快。

c++ optimization rtti libc++ stdany

5
推荐指数
0
解决办法
448
查看次数

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

有一个值存储在std::any,我想知道它是整数值(char, short, int, long,有符号和无符号)还是浮点值(float, double),或其他东西。

如果我只需要检查int值,我会这样做:

std::any a;
if (a.type() == typeid(int)) {
  // do some logic for int
}
Run Code Online (Sandbox Code Playgroud)

但是if (a.type() == typeid(int) || a.type() == typeid(signed char)...)在 C++ 中为所有整数类型做一个巨人似乎......很糟糕。

如果我可以以某种方式访问该类型,我可以使用is_arithmetic<T>from但我没有,我只有which 返回。type_traitsTstd::any#type()std::type_info

有没有办法在if条件中没有很多很多分离的情况下实现这一点?

(如果重要的话,我使用 C++20)

c++ stdany c++20

5
推荐指数
1
解决办法
123
查看次数

通过 std::any 向上转换

在 C++ 中,如果是 的基类,则可以将 的实例传递Derived给接受 的函数。这对于满足 API 非常有用,也是 API 的一种非常常见的设计模式。BaseBaseDerived

目前我面临着一种情况,我想通过std::any. 也就是说,我有std::any一个存储 的实例Derived,并且我想将其地址转换为BaseAPI 函数中的指针,该函数不应该知道 的存在Derived。我的用例是一个运行时反射库,它传递std::any存储反射类型的实例。

我知道向上转换std::any是不可能的,因为std::any_cast在转换之前检查typeid并返回 anullptr如果类型不匹配,请参阅cppreference

但也许有一个解决方法或一些我可以使用的聪明技巧?感觉这一定是可能的,因为向上转换在 C++ 中是很常见的事情,并且std::any 已经需要的地址和类型。

这是一个代码示例。以下代码按预期出现段错误,因为std::any_cast返回的 a在下一行中被取消引用nullptrany_function编译器浏览器:https://godbolt.org/z/E9sG9G3ff

#include <any>
#include <iostream>

class Base 
{
public:
    double get_val() const {
        return val;
    }

private: 
    double val {1.23};
};

void …
Run Code Online (Sandbox Code Playgroud)

c++ std c++17 stdany

4
推荐指数
1
解决办法
418
查看次数

为什么在dlopen'd函数内传递std :: any的std :: any_cast会引发错误

我正在玩c ++ 17和插件,我遇到了一个我无法解决的错误.在下面的MWE中,我可以调用一个带有a的本地函数,std::any当我尝试读取内容时,一切都按预期工作.当我通过插件(dlopen)加载这个完全相同的函数时,它正确地看到了any上的类型,但它不能std::any_cast是内容.

在弄清楚导致此错误的原因时,将非常感谢任何帮助.

这是我的环境,MWE和产生的错误.

>> g++ --version

g++ (GCC) 7.1.1 20170526 (Red Hat 7.1.1-2)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

>> scons --version

SCons by Steven Knight et al.:
    script: v2.5.1.rel_2.5.1:3735:9dc6cee5c168[MODIFIED], 2016/11/03 14:02:02, by bdbaddog on mongodog
    engine: v2.5.1.rel_2.5.1:3735:9dc6cee5c168[MODIFIED], 2016/11/03 14:02:02, by bdbaddog on mongodog
    engine path: ['/usr/lib/scons/SCons']
Copyright (c) …
Run Code Online (Sandbox Code Playgroud)

c++ scons dlopen c++17 stdany

3
推荐指数
1
解决办法
481
查看次数

获取 std::any 的大小

有没有办法获得存储的数据的大小(以字节为单位)std::any?我想出的唯一解决方法是查询其值的类型,std::any::type并将结果与​​已知类型列表进行比较,例如my_any.type() == typeid(T),然后大小为sizeof(T). 不幸的是,此解决方案仅适用于事先知道类型的情况。

你知道有什么解决办法吗?

c++ sizeof type-erasure stdany

3
推荐指数
2
解决办法
1069
查看次数

如何根据枚举参数返回不同的类型

我有两个需要以下功能的功能:

功能1:需要变量的地址来设置值。(它知道正确的类型)

函数2:是一个需要类型值的重载函数。

我需要一种基于枚举(指定要使用的类型)返回不同类型的方法。

我尝试使用 std::get 因为您可以使用数字来指定类型。然而,它要求 SelectedType 是一个常量表达式,但事实并非如此。

std::variant<uint8_t,int8_t,uint16_t,int16_t,double,float> Var;
std::get<SelectedTypeEnum>(Var)
Run Code Online (Sandbox Code Playgroud)

要点是使用一个变量来避免代码重复。

考虑以下代码:

enum Type{
Type_uint8_t,
Type_int8_t,
Type_uint16_t,
Type_int16_t,
Type_std::string
} TypeList;

GetTypeToUse(Type&){ /* Get/Set the type to use */ }

void SetValueBasedOnEnum(Type TypeToUse,void* ptr) {/* Function 1: Sets the value of the type */}

// This is a  Overloaded Function which supports all types in the enum. 
//"T" represents the type.
void DoStuffWithDifferentTypes(T ValueOfType) { /*Function 2:*/ }



Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae stdany std-variant

3
推荐指数
1
解决办法
2353
查看次数

在没有 RTTI 的情况下检查 std::any 的类型

我正在使用std::anyRTTI 并禁用异常。它可以工作并且std::any_cast<T>()能够检测类型是否正确,如std::any 中所解释的,没有 RTTI,它是如何工作的?std::any::type()但在没有 RTTI 的情况下会被禁用。

我想检查我的std::any对象是否包含给定类型的值。有什么办法可以做到这一点吗?

c++ types rtti stdany

3
推荐指数
1
解决办法
662
查看次数

来自 std::any 的足够散列

C++ 中是否有足够的方法从 std::any 存储的数据中提取散列?好吧,或者至少是一个字节列表形式的对象及其长度

c++ hash stdany

3
推荐指数
1
解决办法
114
查看次数

std::any_cast 不需要原始对象的类型

是否可以std::any_cast在不放入第一个模板参数(所覆盖的对象的类型any)的情况下使用?我尝试使用any_cast<decltype(typeid(toCast).name())>但没有成功。

还尝试从一开始就存储对象类型,但这也不起作用,因为变量无法存储类型。

c++ casting std stdany anycast

3
推荐指数
1
解决办法
1365
查看次数