Est-il possible en "C++ moderne" (C++17 ou plus) de passer une chaîne littérale comme paramètre à un modèle C++ ? (C++17 ou supérieur) de passer une chaîne littérale comme paramètre à un modèle C++ ?
Je me rends compte que vous pourriez faire cela avec l'argument du constructeur ; je pensais simplement qu'il serait plus pratique de l'avoir comme argument de modèle, plutôt que d'être enterré profondément dans le fichier cpp. J'étais curieux de savoir si c'était une nouvelle fonctionnalité du C++ moderne. Voir le pseudo-code ci-dessous de ce que j'essaie de faire :
Exemple de pseudo-code :
// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
ModuleBase();
string name;
};
class xyz : ModuleBase<"xyz"> {
public:
xyz();
};
// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
name = Name;
}
xyz::xyz() : ModuleBase() {
}
2 votes
Pour info, vous ne pouvez pas mettre les définitions d'une classe template dans un fichier cpp : stackoverflow.com/questions/495021/
5 votes
@NathanOliver vous pouvez, avec de longues mises en garde.
0 votes
@Nathan Cette réponse ne dit pas exactement cela - vous avez certainement puede mettre une définition de gabarit dans un fichier source C++, bien que cela ne fasse généralement pas ce que vous voulez.
2 votes
Oui, je sais, mais c'est beaucoup plus facile de laisser le PO lire l'explication réelle que d'essayer de la résumer dans un commentaire
0 votes
Vous pouvez le faire... il a juste une syntaxe bizarre... template<class T> MyClass<T>::Method(T x) { ... }... Cependant, je n'ai pas eu de chance pour que les constructeurs acceptent cette syntaxe en utilisant Visual Studio 2015... mais une méthode générale fonctionne bien...
0 votes
Je vois où quelqu'un l'a proposé récemment : www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0424r2.pdf.
6 votes
@BillMoore Le problème n'est pas la syntaxe, mais la sémantique - le modèle. définition (pas seulement la déclaration !) doit être visible du côté de l'utilisateur - il faudrait donc l'utiliser comme un en-tête de toute façon (ou bien ne l'utiliser que localement).
1 votes
stackoverflow.com/questions/1826464/
0 votes
@BillMoore, Selon ce rapport de voyage Ce document a été accepté par l'EWG, mais a finalement été retiré, laissant le changement dans la réponse ci-dessous comme seule solution.
1 votes
Je suppose que vous n'aimez pas l'ancienne méthode, qui consiste à déclarer le modèle en tant que
ModuleBase<const char *>
ayant unextern char const *xyz="xyz"
et ensuite se spécialiser avecModuleBase<xyz>
?0 votes
Je ne suis pas sûr que vous puissiez le faire, mais vous pouvez peut-être vous en sortir en faisant d'abord un hachage au moment de la compilation de la chaîne littérale, puis en utilisant ce hachage comme paramètre de modèle. Vous pouvez utiliser ce petit bout de code que j'ai écrit pour le hachage au moment de la compilation des chaînes de caractères : github.com/WojciechMigda/static-string-hash Ensuite, vous pourrez écrire :
ModuleBase<"xyz"_hash>
0 votes
J'ai vu cela dans C++11 en utilisant char[]. Je ne m'en souviens pas bien. C'est pourquoi c'est juste un commentaire.