Quelle est la méthode la plus concise d'écrire ci-dessous statique consexprzeprze_t FOO :: SUM () code> méthode en C ++ 11? Cela fonctionne bien avec C ++ 17 compilateurs, mais je cherche une manière qui fonctionne sur G ++, Clang et Visual Studio 2015 en mode C ++ 11.
$ g++ --version
g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
...
$ g++ -std=c++17 sum.cpp
$ ./a.out
sum = 12
4 Réponses :
Je l'écrirais comme suit:
template <typename T, size_t N> constexpr size_t Foo<T, N>::sum() { return foo_sum<Foo<T, N>>::value; }
Cela fonctionne. Sur Visual Studio 2015, je recevais le problème infâme C1001 erreur fatale mais en mélangeant un code environnant, il a compilé. Jamais rencontré un problème avec GCC ou Scrang. Merci!
avec étage Dispatching: implémentation de somme code>: p>
J'ai essayé cette approche et cela fonctionne bien sur g ++ et clang. Pour une raison quelconque, Visual Studio 2015 tente toujours de compiler Sum_Impl (std :: true_type) code> et donne une erreur de compilateur lorsque T = Double.
@Matt honte. Cet exemple semble fonctionner avec plus récent MSVC.
@Matt essayez de faire le premier sum_impl code> un modèle lui-même.
Qu'en est-il de la spécialisation de la classe code> FOO code>?
Vous pouvez également éviter - EDIT - P> P> La OP demande: p> En pratique, FOO est une classe nombreuse avec de nombreuses fonctions membres. Cela aurait-il besoin de redécriger tous tous? p>
blockquote> Pas nécessairement: vous pouvez faire le tour avec une classe de base / la structure de is_foo code>. p>
FOO code> (
bar code>, dans l'exemple suivant) p> < Pré> xxx pré> p>
En pratique, FOO est une classe importante avec de nombreuses fonctions membres. Cela aurait-il besoin de redécriger tous tous?
@Matt - Réponse améliorée; J'espère que cela t'aides.
Une approche alternative de Réponse de HolyBackCat consiste à utiliser la surcharge de fonction:
template <typename> struct tag {}; template <typename T> constexpr size_t sum(tag<T>) { return 0; } template <typename T, size_t N> constexpr size_t sum(tag<Foo<T,N>>) { return sum(tag<T>{}) + N; }
Vous vous demandez simplement comment remplacer le
si Constexpr code> puis, non?
activer_if code>?
J'ai essayé Sfinae avec
consexpr typename std :: activer_if :: Valeur, Taille_T> :: Type FOO :: SUM () CODE> Mais je reçois l'erreur
prototype de 'constexpr typename std :: activer_if> :: Valeur, long non signé Int> :: Type FOO :: Sum ()' ne correspond à aucun dans Classe 'FOO ' CODE>.