template expression, foncteurs et static_assert/enable_if
Bonjour à tous!
Ma question est assez simple à formuler: Comment valider les paramètres (de types) d'un operateur + combinant deux fonctions en une seule, dans le cadre d'expression template.
Mon objectif est d'avoir une template de la forme suivante:
Code:
1 2 3 4 5 6
| template <typename F1, typename F2>
auto operator+(F1 f1, F2 f2) {
static_assert(F1 et F2 s'appelle avec les mêmes arguments);
static_assert(F1 et F2 produisent des types additionnables);
return my::plus<F1, F2>{f1, f2};
} |
La difficulté étant que la template doit pouvoir être instanciée pour plusieurs signatures, par exemple, deux fonctions int(int) ou deux fonctions double(double, double).
J'essaie d'avoir un message clair si les types ne sont pas des fonctions/foncteurs compatible.
Par contre, je peux certainement rajouter des enable_if pour m'assurer d'avoir des foncteurs/fonctions, comme types. Cependant qu'en sera-t-il des lambda généralisées?
A priori, j'ai raté une astuce dans <type_trait>.
Quel serait le mécanisme pour vérifier qu'une expression est valide? un équivalent de is_compilable(f1+f2).