我想在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&
。
答案 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>
的对象,而引用包装器是一个具有值语义的类,它包含一个引用 - 这正是你想要放入容器的那种东西如果您希望容器跟踪外部引用。
所以,请选择您的解决方案。
如果你愿意的话,你就不能拥有一个直接的裸体引用容器,就像你不能拥有一系列引用一样。包装机的设计精确,以满足这些需求。