2017-09-05 1 views
0

J'essaie d'implémenter une métafonction (?) Dans des modèles variés pour calculer le maximum de sizeof de quelques types au moment de la compilation.Taille maximale de la métafonction dans les modèles variadiques

template<typename... Ts> struct MaxSizeof { 
    static constexpr size_t value = 0; 
}; 

template<typename T, typename... Ts> struct MaxSizeof { 
    static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value); 
}; 

Mais je reçois quelques erreurs étranges:

MaxSizeof.h(7): error C3855: 'MaxSizeof': template parameter 'Ts' is incompatible with the declaration 
MaxSizeof.h(7): error C2977: 'MaxSizeof': too many template arguments 
MaxSizeof.h(5): note: see declaration of 'MaxSizeof' 

Pouvez-vous aider à fixer mon code?

Le compilateur est le jeu d'outils MSVC++ 2017 v141.

+3

Êtes-vous manque un ** statique ** avant constexpr? – Phil1970

+0

@ Phil1970, merci, j'ai mis à jour le code et les messages d'erreur. –

Répondre

3

Votre spécialisation a une syntaxe incorrecte, il devrait être:

template<typename T, typename... Ts> 
struct MaxSizeof<T, Ts...> { // Note the <T, Ts...> here 
    // .... 
}; 
+0

Oui, merci, je viens de comprendre cela moi-même. –

0

std::max est seulement marqué constexpr depuis C++ 14, vous devrez donc écrire le vôtre. En outre, vous ne pouvez pas surcharger les structures, ce qui est l'une des raisons pour lesquelles votre code échoue.

Voici une solution nécessitant le std::max de C++ 14, que vous pouvez modifier pour en utiliser une personnalisée selon vos besoins.

template<typename... Ts> 
struct MaxSizeof : std::integral_constant<std::size_t, std::max({sizeof(Ts)...})> {}; 
+0

Mais ici http://eli.thegreenplace.net/2014/variadic-templates-in-c/ dans le premier exemple sous "Structures de données Varidiques" l'auteur semble surcharger une structure, n'est-ce pas? –

+0

@SergeRogatch Si vous voulez dire le tout premier, c'est une fonction. Il y en a un plus tard avec des structures, et c'est une spécialisation partielle. – Rakete1111

0

Il y avait 2 corrections nécessaires:

  1. Comme l'ont souligné @ Phil1970, j'oubliais static pour value définition.
  2. J'ai dû spécifier des arguments de modèle sur la ligne 7: struct MaxSizeof<T, Ts...> { au lieu de simplement struct MaxSizeof {.

Ainsi, le code suivant compile:

template<typename... Ts> struct MaxSizeof { 
    static constexpr size_t value = 0; 
}; 

template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> { 
    static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value); 
}; 
0

Une autre solution mineure nécessaire:

template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> { 
    static constexpr size_t value = std::max(sizeof(T), MaxSizeof<Ts...>::value); // there should be with no `typename` 
};