J'ai un tas de code, qui est encombré avec des blocs de préprocesseur, comme #ifdef FEATURE_A
, #ifdef _MSC_VER
et ainsi de suite.Remplacer les blocs #ifdef préprocesseur par l'implémentation de modèle
Je voudrais refactoriser une partie du code afin de remplacer certains blocs de préprocesseur par des implémentations de modèles.
EDIT: La tâche est de ne pas supprimer tous les blocs de préprocesseur, mais certains d'entre eux, afin de se débarrasser de l'encombrement.
Je ne veux pas vous ennuyer avec des exemples de foobar, voici donc un du monde réel (pas mon code):
template <typename T>
std::string demangle()
{
#ifdef __GNUC__
size_t sz;
int status;
char* ptr = abi::__cxa_demangle(typeid(T).name(), 0, &sz, &status);
std::string name(ptr ? ptr : "", ptr ? strlen(ptr) : 0);
if(ptr){ free(ptr); }
std::string::size_type pos = name.rfind("::");
if(pos != std::string::npos)
{
name = name.substr(pos + 2);
}
#elif _MSC_VER
std::string name(typeid(T).name());
static const std::string struct_prefix("struct ");
static const std::string class_prefix("class ");
static const std::string ptr_postfix(" *");
std::string::size_type
at = name.find(struct_prefix);
if(at != std::string::npos) { name.erase(at, struct_prefix.size()); }
at = name.find(class_prefix);
if(at != std::string::npos) { name.erase(at, class_prefix.size()); }
at = name.find(ptr_postfix);
if(at != std::string::npos) { name.erase(at, ptr_postfix.size()); }
#else
std::string name(typeid(T).name());
#endif
return name;
}
Question 1: Comment transformer ce à une mise en œuvre du modèle de equvalent ?
Question 2: Pourquoi vaut-il la peine, ou pourquoi pas?
De toute façon, vous avez besoin de ces définitions de préprocesseur. Peut-être que vous avez trois fonctions 'std :: string demangle()' (peut-être réparties sur plusieurs fichiers pour plusieurs compilateurs). –
Oui, vous en avez besoin de toute façon, mais vous pouvez supprimer le fouillis de l'implémentation. – mrAtari
En supposant que vous puissiez remplacer les directives du préprocesseur par des modèles (d'autres ne le peuvent pas), il est peu probable qu'un tel remplacement utilise moins de volume total de texte. Donc, vous obtiendriez quelque chose de plus gros et de plus maladroit, qui fonctionnerait d'une manière surprenante pour le lecteur. Après tout, les codeurs C++ * savent * quelles sont les directives PP. Donc, je ne vois pas comment cela pourrait être une victoire. –