Je fonction constexpr qui compte nombre d'espaces réservés https://godbolt.org/g/JcxSiu,Compile contrôle horaire si sizeof ... (args) correspond à la suite de la fonction constexpr
par exemple: "Hello %1
" renvoie 1
, et "Hello %1, time is %2
" renvoie 2
.
Ensuite, je voudrais faire une fonction qui ne compile pas si le nombre d'arguments n'est pas égal au nombre d'espaces réservés.
template <typename... Args>
inline std::string make(const char* text, Args&&... args) {
constexpr static unsigned count = sizeof...(args);
// TODO how to compile time check if count == count_placeholders(text)
// constexpr static auto np = count_placeholders(text);
//static_assert(count == np;, "Wrong number of arguments in make");
return std::to_string(count);
};
afin que make("Hello %1", "World");
compile et
make("Hello %1 %2", "World");
ou make("Hello %1", "World", "John");
ne fonctionne pas.
Je pense que cela peut être fait, je ne sais pas comment. Peut-être avec un peu Magick modèle :)
EDIT
Je reçois presque ce que je veux. https://godbolt.org/g/Y3q2f8
Abandonne maintenant en mode débogage. Il est possible de faire une erreur de compilation?
C'est ** pas une réponse ** car il utilise buf extension buf si cela ne vous dérange pas, vous pouvez utiliser le [modèle littéral de chaîne] (https://wandbox.org/permlink/bSLW5DNEX4gNuDyw). Cela fonctionnera sur gcc et clang mais probablement sur aucun autre compilateur ... –
Ce n'est probablement pas non plus une réponse acceptable, mais voici une solution qui utilise une macro de Boost.Metaparse. [Exemple] (https://godbolt.org/g/tZYzyH). – llonesmiz