【问题标题】:boost::any with structs and unsigned intsboost::any 结构体和无符号整数
【发布时间】:2018-06-27 21:54:10
【问题描述】:

我的问题有几个部分。我一直在研究如何/何时使用boost::any。我想知道是否可以将struct 分配给boost::any 变量。

示例:

struct S {
   int x;
};

S s;
s.x = 5;

boost::any var = s;

在我看来这是可能的,但它引导我进入下一个问题。如果这是一个有效的分配,那么我将如何访问数据成员xvar 不是 struct 类型,因为它是 boost::any

我的下一个问题不取决于数据成员是否可以访问。那么问题是,如果变量auint8_t 类型怎么办。

示例: 编辑:正如 cmets 中所指出的,下面的代码确实支持 uint8_t,但没有打印出来。见uint8_t can't be printed with cout

uint8_t a = 10;

boost::any b = a;

std::cout << boost::any_cast<uint8_t>(b);

我发现可以使用boost::any_cast,但没有发现它支持无符号类型。当我尝试使用boost::any_cast&lt;uint8_t&gt;() 时,它没有打印,但没有抛出错误。是否有可能使用boost 获得像uint8_t 这样的类型的值?如果有怎么办?

我将继续阅读boost::any 的更多文档,但如果有人对这些问题或主题有见解、详细信息或注释,请发帖,因为我很想了解更多有关其工作原理的信息。谢谢!

【问题讨论】:

  • 最好的方法是尝试一下。我没有看到 uint8_t 有任何问题,除了 pre-c++11 之前它可以别名为 char。 any 的原理是类型擦除。谷歌它
  • 如您链接到的文档中所述,转换是通过any_cast,而不是cast_any。如果这是您问题中的错字,请更正它。如果这是您的代码中的拼写错误,那么也许这就是您的问题之一。
  • @JaMiT 是的,这是一个错字,谢谢。
  • 使用any_cast 转换为uint8_t 应该可以。您可能遇到this 问题
  • @vu1p3n0x 我认为你是对的。由于我看不到值,所以我在any_cast 上使用了sizeof 并看到它是1。所以我认为值在那里.. 感谢输入

标签: c++ c++11 boost unsigned-integer boost-any


【解决方案1】:

我想知道是否可以将结构分配给boost::any 变量

是的。

如何访问数据成员x

您可以使用any_cast&lt;S&gt;(var).x 访问。继续你的例子:

int& the_x_member = any_cast<S>(var).x;
std::cout << "s.x is " << the_x_member << "\n";

如果变量auint8_t 类型怎么办?

完全可以将无符号整数类型分配给boost::any(或std::any,其作用相同,但语法稍有不同)。

当我尝试使用 boost::any_cast&lt;uint8_t&gt;() 时,它没有打印,但没有抛出错误。

这不会“打印”\0 字符吗?所以看起来什么都没有打印出来。

是否可以使用 Boost 来获取像 uint8_t 这样的类型的值?如果有怎么办?

正如你所料:

uint8_t u = 234;
boost::any ba = u;
std::cout << "u is " << (int) boost::any_cast<uint8_t>(ba) << '\n';

这个does indeed work

【讨论】:

  • 非常感谢您的见解,非常有帮助。我意识到我的第二个示例再次使用x 具有误导性,这使我看起来实际上确实认为它仍然是一个数据成员。我将对其进行编辑,以便将来的读者更清楚。非常感谢!
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2020-07-17
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多