Je suis en train d'écrire une méthode qui est en charge du formatage et de l'impression d'informations.Détection si un type de modèle est lui-même un type de modèle
Il existe un problème/une caractéristique dans boost::optional<T>
, qui will print an extra blank space lors de la sortie dans un flux si et seulement si le optional
a une valeur.
Je peux voir deux options:
- Utilisation deux fonctions différentes: un général et qui traite explicitement
boost::optional<T>
- En utilisant une seule fonction qui permet de détecter si l'argument est de type
boost::optional<T>
et beaucoup avec en conséquence
Option 1 pourrait être quelque chose comme ceci:
template <typename T>
void print(const T& o)
{
std::cout << o << "\n";
}
template <typename T>
void print_optional(const boost::optional<T>& o)
{
if (o)
print(*o);
else
print("--");
}
Cela fonctionne, mais il a le problème qu'aucune erreur de compilation ne se produit si nous appelons print()
avec boost::optional
. Je sais de static_assert
et std::is_type
, mais puisque boost::optional
est lui-même modèle je ne sais pas comment vérifier contre cela.
Option 2 serait idéal pour moi, mais la question reste: comment demander le code si une variable est un boost::optional<T>
quel que soit T?
La question posée: "vous ne pouvez pas". Un type est un type. Cependant, vous ne voulez pas cela, vous voulez surcharger les spécialisations (partielles). – sehe