2 votes

Comment calculer la somme en utilisant un lambda générique variadique en C++ ?

Je voulais écrire une fonction générique de somme comme la suivante mais pas dans la syntaxe template mais dans la syntaxe lambda :

template<typename T>
auto Sum(T lastSummand)
{
    return lastSummand;
}

template<typename T, typename... Ts>
auto Sum(T firstSummand, Ts... restSummands)
{
    return firstSummand + Sum(restSummands...);
}

Les lambdas génériques étant mappés sur des modèles, il devrait être possible de faire quelque chose comme :

auto sum = [](auto firstSummand, auto... restSummands) { ... };

Mais je n'arrive pas à comprendre comment faire la récursion en utilisant des lambdas. Les recherches sur ce site et sur d'autres sites n'ont pas donné grand-chose.

0voto

Je suppose que vous avez besoin d'un type semblable à un foncteur pour calculer la somme si vous utilisez le lambda. Si c'est le cas, je suppose que vous pourriez écrire une petite classe générique pour prendre la place de cette lambda.

template < typename T > struct Sum
{
    template < typename U >
    T operator () (U v) const noexcept
    {
        return static_cast< T >(v);
    }

    template < typename U, typename... Values >
    T operator () (U v, Values&&... vs) const noexcept
    {
        return static_cast< T >(v) + (*this)(std::forward< Values >(vs)...);
    }
};

Et utilisé comme :

auto sum = Sum< int >();
printf("%d\n", sum(23, 4.0, true, 7));

Je l'ai écrit de manière à ce que le type de retour puisse être spécifié à l'avance. Mais je suppose que vous pourriez l'adapter pour le rendre générique également.

Si ce n'était pas votre intention, veuillez ignorer cette réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X