¿Cómo tener miembros de datos estáticos en una biblioteca de solo cabecera?

¿Cuál es la mejor manera de tener un miembro estático en una clase de biblioteca sin plantillas, sin colocar la carga de definir al miembro en el usuario de la clase?

Digamos que quiero proporcionar esta clase:

class i_want_a_static_member { static expensive_resource static_resource_; public: void foo() { static_resource_.bar(); } }; 

Entonces el usuario de la clase no debe olvidar definir el miembro estático en alguna parte (como ya se ha respondido muchas veces ):

 // this must be done somewhere in a translation unit expensive_resource i_want_a_static_member::static_resource_; 

Tengo una respuesta a continuación, pero tiene algunas desventajas. ¿Hay soluciones mejores y / o más elegantes?

Puede usar variables estáticas locales de función.

 struct Foo { static int& Bar() { static int I; return I; } }; // ^~~~~~~~~~~~ 

Mi propia solución es usar una clase de usuario con plantilla, ya que los miembros estáticos funcionan bien en las plantillas, y usar este soporte como una clase base.

 template  struct static_holder { static T static_resource_; }; template  T static_holder::static_resource_; 

Ahora usa la clase de soporte:

 class expensive_resource { /*...*/ }; class i_want_a_static_member : private static_holder { public: void foo() { static_resource_.bar(); } }; 

Pero como el nombre del miembro se especifica en la clase de titular, no puede usar el mismo titular para más de un miembro estático.