5

我想在对象中存储对对象的引用boost::any。如何初始化 boost::any 对象?我试过了std::ref(),但boost::any被初始化为std::reference_wrapper<>. 例如,以下

#include <boost/any.hpp>
#include <cxxabi.h>
#include <iostream>

int main(void)
{
  int s;
  int i = 0;
  boost::any x(std::ref(i));
  std::cout << abi::__cxa_demangle(x.type().name(), 0, 0, &s) << "\n";
  return 0;
}

印刷

std::reference_wrapper<int>

我希望boost::any改为包含int&

4

2 回答 2

5

该类boost::any没有允许这样的接口:您需要使用构造函数指定引用的类型。我认为您不能明确指定模板构造函数的类型,因为我看不到任何可以粘贴它的地方。即使您可以显式指定模板参数,它在 C++2003 中也不起作用,因为没有可用的引用折叠,并且该参数被声明为采用 a T const&:您将尝试创建T& const&不会飞行的 a。我认为您最好的选择是std::reference_wrapper<T>如果您坚持使用看起来像远程参考的东西,或者只是使用T*.

也就是说,通常可以有一个类型类似的模板化静态因子方法,boost::any用于显式指定模板参数。但是,由于boost::any故意设计为处理值类型,因此没有这样做。我有点怀疑是否也应该这样做:使用指针是非常好的选择。如果你真的需要一个引用类型,你可能必须自己实现它。

于 2012-01-14T21:24:13.967 回答
3

行为是正确的、预期的和适当的。std::ref是一个辅助函数,它创建一个类型的对象std::reference_wrapper<T>,而引用包装器是一个具有值语义的类,它包含一个引用——如果你希望容器跟踪外部引用,这正是你想要放入容器中的那种东西。

因此,只需使用您拥有的解决方案即可。

如果你愿意,你不能有一个直接的、裸引用的容器,就像你不能有一个引用数组一样。包装器的设计正是为了满足这种需求。

于 2012-01-14T23:49:46.227 回答