2012-01-14 21 views
5

Quiero almacenar una referencia a un objeto en un objeto boost::any. ¿Cómo inicializo el impulso :: cualquier objeto? Intenté std::ref(), pero boost::any se inicializó con std::reference_wrapper<>. Por ejemplo, la siguiente¿Cómo inicializo boost :: any con una referencia a un objeto?

#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; 
} 

impresiones

std::reference_wrapper<int> 

Quiero que el boost::any que contienen int& lugar.

+0

Como un lado, no hay type_info para los tipos de referencia, en cambio, type_info para el tipo al que se hace referencia se toma 'cout << typeid (int) .name() <<" \ t "<< typeid (int &). name() << "\ t" << typeid (int) == typeid (int &) 'produce' ii 1', por lo que incluso si el any almacenara una referencia, su tipo seguiría siendo 'typeid (int)' – stellarpower

Respuesta

3

La clase boost::any no tiene una interfaz que permita algo como esto: necesitaría especificar el tipo de la referencia con el constructor. No creo que puedas especificar explícitamente el tipo de constructor con plantilla porque no veo ningún lugar donde puedas pegarlo. Incluso si puede especificar explícitamente el parámetro de la plantilla, no funcionaría en C++ 2003 porque no hay un colapso de referencia disponible y el parámetro se declara como tomando un T const&: estaría intentando crear un T& const& que no lo hará mosca. Creo que su mejor opción es usar std::reference_wrapper<T> si insiste en algo que se parezca remotamente a la referencia o solo para usar T*.

Dicho esto, en general sería posible tener un método de factor estático con plantilla de un tipo similar a boost::any que se usaría para especificar explícitamente el argumento de la plantilla. Sin embargo, dado que boost::any está deliberadamente diseñado para tratar con los tipos de valor , esto no está hecho. Estoy un poco dudoso si debería hacerse también: usar un puntero es una alternativa perfectamente buena. Si realmente necesita un tipo de referencia, es probable que deba implementarlo usted mismo.

3

El comportamiento es correcto, esperado y apropiado. std::ref es una función auxiliar que crea un objeto de tipo std::reference_wrapper<T>, y el contenedor de referencia es una clase con semántica de valores que contiene una referencia; eso es exactamente el tipo de cosas que desea poner en un contenedor si desea que el contenedor rastree fuera de referencias.

Así que simplemente vaya con la solución que tiene.

Si lo desea, no puede tener un contenedor de referencias directas, desnudas, al igual que no puede tener una serie de referencias. La envoltura está diseñada precisamente para satisfacer tales necesidades.

Cuestiones relacionadas