如何初始化boost::any并引用一个对象
How do I initialize boost::any with a reference to an object?
我想在boost::any
对象中存储对对象的引用。如何初始化boost::任何对象?我尝试了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&
。
boost::any
类没有允许这样做的接口:您需要使用构造函数指定引用的类型。我不认为你可以显式指定模板化构造函数的类型,因为我看不出有什么地方可以粘贴它。即使你可以显着指定模板参数,它在C++2003中也不起作用,因为没有可用的引用折叠,并且参数被声明为采用T const&
:你会试图创建一个不会飞的T& const&
。我认为你最好的选择是,如果你坚持要一些看起来像远程参考的东西,要么使用std::reference_wrapper<T>
,要么只使用T*
。
也就是说,通常可以使用类似于boost::any
类型的模板化静态因子方法来显式指定模板参数。然而,由于boost::any
是专门为处理值类型而设计的,因此没有做到这一点。我有点怀疑是否也应该这样做:使用指针是一个非常好的选择。如果你真的需要一个引用类型,你可能必须自己实现它。
行为是正确的、预期的和适当的。std::ref
是一个帮助函数,用于创建std::reference_wrapper<T>
类型的对象,而引用包装器是一个具有值语义的类,用于保存引用——如果您希望容器跟踪外部引用,那么这正是您想要放入容器中的东西。
所以,就用你的解决方案吧。
如果你愿意,你就不能有一个直接的、裸引用的容器,就像你不能有一组引用一样。包装器的设计正是为了满足这种需求。
相关文章:
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 如何在 VC++ 中通过引用传递另一个对象的方法(错误 C2664)
- 另一个迭代器引用的对象被另一个迭代器删除
- C++ 在另一个对象中引用对象的当前状态
- C++:通过引用传递对象数组(指向一个?的指针)
- 为什么引用可能是一个对象
- c++返回一个对象的const引用
- C++如何通过引用将对象的向量传递到一个函数中,然后再传递到下一个函数中
- 返回一个对象:值、指针和引用
- 为什么我们需要一个默认构造函数来通过引用传递对象C++
- 将一个对象传递给一个引用函数,即面试测试
- 如何使用weak_ptr构造一个对象,该对象保存对父项的引用
- 从另一个对象调用一个对象的函数时未定义的引用
- 在C++中,如果我引用一个具有解除分配析构函数~MyClass的对象,那么超出范围的引用会调用析构函数吗
- 如何初始化boost::any并引用一个对象
- C++引用可以引用另一个对象吗
- 如果一个引用一旦被初始化为一个对象,它就不能被改变,为什么这样做呢?
- 在c++中,当我通过引用传递一个对象时,它超出了作用域
- 如何绑定/关联一个对象引用与new[](数组)
- 引用一个未命名的临时对象(生命周期)