J'écris du code qui pourrait vraiment faire avec une simple métaprogrammation de temps de compilation. Il est courant d'utiliser des balises struct-empty comme symboles de compilation. J'ai besoin de décorer les balises avec des éléments de configuration d'exécution. les variables statiques semblent être la seule solution (pour activer la méta-programmation), mais les variables statiques nécessitent des déclarations globales. à côté de cette suggestion de Scott Myers (à partir de la troisième édition d'Effective C++), sur le séquençage de l'initialisation de variables statiques en les déclarant à l'intérieur d'une fonction au lieu de variables de classe, est venu à l'esprit.Méta-programmation de temps de compilation, avec littéraux de chaîne
Donc, je suis venu avec le code suivant, mon hypothèse est qu'il me laissera avoir un symbole de compilation avec des littéraux de chaîne utilisable à l'exécution. Je ne manque rien de ce que j'espère, et cela fonctionnera correctement, tant que je remplis les champs d'exécution avant d'initialiser les classes de modèles dépendantes. .
#include <string>
template<class Instance>
class TheBestThing {
public:
static void set_name(const char * name_in) {
get_name() = std::string(name_in);
}
static void set_fs_location(const char * fs_location_in) {
get_fs_location() = std::string(fs_location_in);
}
static std::string & get_fs_location() {
static std::string fs_location;
return fs_location;
}
static std::string & get_name() {
static std::string name;
return name;
}
};
struct tag {};
typedef TheBestThing<tag> tbt;
int main()
{
tbt::set_name("xyz");
tbt::set_fs_location("/etc/lala");
ImportantObject<tbt> SinceSlicedBread;
}
modifier: Fait communauté wiki.
@Hassan: J'ai remarqué cela tout à l'heure. Mais encore, vous pouvez utiliser de meilleurs tags :) -1 repris cependant. –
les étiquettes sont entièrement appropriées pour n'importe qui recherchant une question ceci spécifique. –
Mais quelle est la question? –