Depuis plusieurs mois, je travaille sur une bibliothèque de composition de fonctions mathématiques et plus si affinités.
Et finalement, je rencontre un problème de construction template.
Le besoin de base est le suivant:
Je passe sous le capot la partie qui permet d'accéder à tous les foncteurs (ca implique std::get<> et std::integer_sequence)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template <des choses, typename F...> struct tied_functors { std::tuple<F...> functors; using signature = std::tuple < std::common_type<le I° argument de chaque F>... >; auto operator() (Args...) const { static_assert( Args... compatible avec signature partagée, "appel impossible" ); return std::make_tuple( functors[](Args...)... ); } };
Mon soucis concret, c'est qu'actuellement, ma détection de signature ne fonctionne pas avec les références (non const).
Or common_type est défini pour retirer les références (et cv-qualifiers)
du coup, si j'ai deux foncteurs de type iterator double(Bidule&) et int(Bidule&), j'ai bien comme signature effective std::tuple<double, int>(Bidule).
Ce qui ne fonctionne pas, car le bidule transmis en référence non constante est une temporaire.
Ma question s'articule donc ainsi:
sachant deux foncteurs f(A) et g(B), quel type C d'argument dois-je utiliser pour le transmettre à f et g?
Je n'arrive pas à me dépatouiller dans la norme…
Partager