如何通过引用对象来初始化boost :: any?

时间:2012-01-14 20:30:46

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

我想在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&

2 个答案:

答案 0 :(得分:3)

boost::any类没有允许这样的接口:您需要使用构造函数指定引用的类型。我不认为你可以明确指定模板化构造函数的类型,因为我没有看到任何你可以坚持它的地方。即使您可以显式指定模板参数,它也不适用于C ++ 2003,因为没有可用的参考折叠,并且参数被声明为采用T const&:您将尝试创建{ {1}}不会飞的。 我认为您最好的选择是使用T& const&,如果您坚持使用std::reference_wrapper<T>进行远程引用或仅使用T*

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

答案 1 :(得分:3)

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

所以,请选择您的解决方案。

如果你愿意的话,你就不能拥有一个直接的裸体引用容器,就像你不能拥有一系列引用一样。包装机的设计精确,以满足这些需求。