Supongamos que tengo una clase como esta:¿Por qué no se permite decltype en las variables de miembros privados?
class Foo
{
std::vector<int> bar;
public:
std::vector<int>& get_bar() { return bar; }
};
y más tarde, quiero otra cosa en algún variables que tiene el mismo tipo que bar
. Tendría sentido para mí si pudiera hacer esto:
decltype(Foo::bar) clone_of_bar;
Pero eso no funciona. El compilador me dice 'std :: vector < int> Foo :: bar' es privado.
Así que terminan por tener que usar algo como esto:
std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
que funciona, pero parece un completo desastre. Tal vez hay una manera más fácil de hacerlo; No estoy realmente seguro. Pero lo que realmente quiero saber es por qué no puedo usar decltype(Foo::bar)
. ¿Por qué debería importarle a nadie que bar
sea privado? No es como si realmente estuviera accediendo a la variable.
decltype
es una nueva característica del idioma. Simplemente no entiendo por qué fue diseñado para no trabajar en variables privadas.
Yo realmente lo apreciaría si usted podría darnos algún ejemplo real ** ** en la que se beneficiaría del uso de decltype de miembros privados. – mfontanini
Bueno, tengo razones realmente sólidas para querer hacer esto. Fue mayormente solo curiosidad. Pero el caso donde traté de usarlo fue este: estaba usando google protobuf, para lo cual defino algunos tipos de eventos y luego protobuf genera algún código para esos tipos. El código generado se parece un poco a lo que escribí en mi ejemplo de pregunta. La cuestión es que quiero poder copiar algunos datos del mensaje protobuf para hacer algunas cosas y no quiero tener que cambiar el código si cambio el tipo en el mensaje protobuf. Entonces eso es lo que quería hacer. No es realmente un gran problema. – karadoc
¿No podría simplemente usar "auto x = somefoo.get_bar();" ? Estarías copiando, sin proporcionar explícitamente el tipo de "x". – mfontanini