J'ai du mal à comprendre le code suivantspécialisation de modèle avec la liste des paramètres du modèle non vide
template <typename T>
struct function_traits
: public function_traits<decltype(&T::operator())>
{};
// For generic types, directly use the result of the signature of its 'operator()'
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
// we specialize for pointers to member function
{
// ...
}
int main()
{
auto lambda = [](int i) { return long(i*10); };
typedef function_traits<decltype(lambda)> traits;
// ...
return 0;
}
qui se produit dans la réponse https://stackoverflow.com/a/7943765/7006673.
Ici,
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
semble indiquer une spécialisation de la classe de modèle
template <typename T>
struct function_traits
cependant, la liste des paramètres du modèle de la spécialisation template <typename ClassType, typename ReturnType, typename... Args>
n'est pas vide (c.-à-n'est pas égal à template <>
). Quelqu'un peut-il m'aider s'il vous plaît à comprendre, quel genre de spécialisation c'est et comment les paramètres de modèle ClassType
, ReturnType
, et Args
sont déduits?
Merci beaucoup à l'avance.
Merci beaucoup. Une question demeure: je pensais que la déduction de type ne peut être faite que pour les paramètres de modèle de fonctions et non pour ceux de structures et de classes - ai-je tort? –
L'instanciation implicite ne peut être faite que pour les paramètres de modèle de fonctions: vous passez explicitement des arguments lors de l'appel de la fonction, de sorte que leurs types peuvent être déduits implicitement. Ici 'function_traits' est une instanciation explicite avec 'T = decltype (lambda)' –
wasthishelpful
Merci! Et la déduction de 'ReturnType',' ClassType' et 'Args' basé sur' decltype (lambda) 'peut être fait puisque' decltype (lambda) 'est un paramètre de template - est-ce exact? –