0
votes

Comment écrire cette méthode C ++ 17 Static Consexport en C ++ 11?

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


2 commentaires

Vous vous demandez simplement comment remplacer le si Constexpr puis, non? activer_if ?


J'ai essayé Sfinae avec consexpr typename std :: activer_if :: Valeur, Taille_T> :: Type FOO :: SUM () 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 ' .


4 Réponses :


5
votes

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;
}


1 commentaires

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!



1
votes

avec étage Dispatching: xxx

implémentation de somme : xxx


3 commentaires

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) 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 un modèle lui-même.



0
votes

Qu'en est-il de la spécialisation de la classe FOO ?

Vous pouvez également éviter is_foo . xxx

- EDIT -

La OP demande:

En pratique, FOO est une classe nombreuse avec de nombreuses fonctions membres. Cela aurait-il besoin de redécriger tous tous?

Pas nécessairement: vous pouvez faire le tour avec une classe de base / la structure de FOO ( bar , dans l'exemple suivant) < Pré> xxx


2 commentaires

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.



2
votes

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;
}


0 commentaires