Es imposible asociar un parámetro de plantilla porque el estándar no lo permite. ¿Cómo podría obtener efectivamente lo mismo entonces?Simulando un parámetro de plantilla
Lo que quiero es básicamente un tipo que no se puede usar fuera del objeto que lo posee. Por qué está más allá del punto, pero si realmente debe saberlo, estoy tratando de formular un conjunto de indicadores inteligentes que respondan al problema de compartir un recurso de propiedad. Por lo tanto lo que estoy tratando de hacer es algo así como así, si ha funcionado:
template < typename T, typename Owner >
struct accessible_member
{
private:
accessible_member() : val(T()) {}
accessible_member(T const& t) : val(t) {}
operator T&() { return val; }
operator T const&() const { return val; }
member_ptr<T> operator &() { return member_ptr<T>(val); }
friend class Owner;
};
Así, una clase no puede sostener este objeto como un miembro a menos que se declare el propietario, y si es lo suficientemente tonto para exponer como es, será imposible usar fuera de la clase siendo tan estúpido.
No veo el punto de tratar de prevenir el código braindead (como en el último párrafo). En C++, solo tienes que aceptar que alguien puede romper tu código si se esfuerzan lo suficiente. –
@Fred: ese mismo argumento tonto se puede usar contra todos y cada uno de los intentos de introducir medidas de seguridad del código, incluidos 'const' y RAII. Es posible que trabaje bajo una filosofía diferente, pero codigo bajo la pauta que sus construcciones deberían ser fáciles de usar y difíciles de usar de forma incorrecta. Todo el punto en la construcción en sí es introducir una medida de seguridad no proporcionada por otra cosa. Considero que sus objeciones a mi pregunta son redundantes, fuera de lugar y francamente ofensivas. –
@NoahRoberts: 1) Esto no parece ser fácil de usar correctamente. 2) Const y RAII son fáciles de usar de forma incorrecta. 3) ¿Cómo puede encontrar que mi * falta de comprensión ("No veo el punto") es ofensivo? ¿Te ofendes en mi nombre para protegerme de mí? –