web-dev-qa-db-fra.com

Est-il possible en C++ moderne de passer un littéral de chaîne en tant que paramètre à un modèle C++?

Est-il possible dans "C++ moderne" (C++ 17 ou supérieur) de passer un littéral de chaîne en tant que paramètre à un modèle C++?

Je me rends compte que vous pouvez le faire avec un argument constructeur. Je pensais simplement qu'il serait plus pratique de l'utiliser comme argument de modèle plutôt que de l'enfouir profondément dans le fichier cpp. J'étais curieux de savoir s'il s'agissait peut-être d'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() {

}
50
Bill Moore

Oui, dans c ++ 20

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

c ++ 20 ajoute une comparaison d'opérateur de vaisseau spatial <=>. S'il est fourni par l'utilisateur (et basé uniquement sur <=> fourni par l'utilisateur, à tour de rôle, répétez-le de manière récursive) (et un peu d'autres exigences; voir p0732 ), le type peut être utilisé comme non argument de template.

Ces types peuvent être construits à partir de "strings" brut dans les constructeurs constexpr, notamment à l'aide des guides de déduction c ++ 17 pour les redimensionner eux-mêmes.

Étant donné que la taille des données stockées fera probablement partie du type, vous souhaiterez prendre le type sous la forme d'un type paramètre non typé à la forme auto } ou autrement déduit automatiquement.


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

55

Jusqu'à ce que vous obteniez c ++ 20 et si vous avez boost , vous pouvez trouver la macro suivante utile:

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

Puis utilisez comme suit:

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