54 votes

Est-il possible, dans le C++ moderne, de passer une chaîne de caractères littérale comme paramètre à un modèle C++ ?

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.

58voto

Yakk Points 31636

Oui, en c++20 .

Le problème était qu'il était difficile de déterminer l'unicité d'un argument non-type d'un modèle.

c++20 ajoute dans un <=> comparaison des opérateurs de vaisseaux spatiaux. S'il est fourni par un non-utilisateur (et basé uniquement sur des <=> qui se répètent à leur tour de manière récursive) (et une quelques autres exigences ; voir p0732 ), le type peut être utilisé comme un argument de modèle non-type.

De tels types peuvent être construits à partir de données brutes "strings" en constexpr y compris l'utilisation de c++17 des guides de déduction pour qu'ils se dimensionnent automatiquement.

Comme la taille des données stockées va probablement faire partie du type, vous voudrez prendre le type comme un auto paramètre non typé ou d'un autre type d'autodidacte.


Notez que placer l'implémentation de votre modèle dans un fichier cpp est généralement une mauvaise idée. Mais ceci est une autre question.

1 votes

Cette proposition a été acceptée par l'EWG, mais, à ma connaissance, elle doit encore passer par le CWG avant d'être intégrée à C++20 (avec les réserves habituelles selon lesquelles C++20 n'est pas terminé tant qu'il ne l'est pas). Cependant, cela semble vraiment probable.

19 votes

Je suis déraisonnablement heureux que <=> est largement connu comme "l'opérateur de vaisseau spatial".

1 votes

@TiStrga Il était nommé ainsi même dans le document d'introduction : open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdf pew pew

2voto

darune Points 3515

Jusqu'à ce que vous obteniez c++20 et si vous avez booster vous trouverez peut-être la macro suivante utile :

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value

Utilisez ensuite comme suit :

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X