Quelqu'un a déjà posé cette question, mais le fil s'est retrouvé avec la question originale n'ayant pas répondu.
Supposons que vous ayez ceci: p>
f< i >(); // doesn't work f()< i >; // doesn't work f.operator< i >(); // doesn't work f.operator()< i >; // doesn't work f.operator()< i >(); // works on msvc, but doesn't work on gcc.
3 Réponses :
Le modèle de membre est un nom dépendant, car sa sémantique dépend du type de f_type code>. Cela signifie que vous devriez mettre le "modèle" avant son nom (pour désambigucher l'utilisation du jeton "moins que"), similaire à la manière dont vous devez mettre
typename code> avant les noms qualifiés dépendants:
template<size_t i> void operator()(size_t_<i>) const {
// i was deduced automatically by the function argument.
}
@Johannes: Pourquoi ne pas se spécialiser pour les fonctions utilisant Sfinae?
fonctionne très bien! absolument génial. Tu es mon méta-héros. Ah, et votre idée d'utiliser mpl :: int_ est intelligente aussi.
@ laulaulabs.mp, heureux d'être utile :)
J'ai trouvé comme @ laulaulabs.mpère qui tente de passer des modèles de fonction comme ça n'a pas de sens. De sorte que la solution de contournement utilisant taille_t _ code> est discutable dans ce scénario. Modifié la réponse en conséquence.
#include <iostream> template<size_t i, class f_type> void call_with_i(f_type f); struct A { template < size_t i > void operator()() const { /* no link err in demo */ } template < size_t i > void foo() { /* no link err in demo */ } }; int main(int argc, char * const argv[]) { A f; enum { Constant = 42 }; f.operator()<Constant>(); f.foo<Constant>(); return 0; } Is there a way to invoke it in a way that the same syntax would also call a templated free function? Can you clarify? (pseudocode, or something)
En fait, mon bit sur la fonction libre modélisée n'est que des non-sens depuis que vous ne pouvez pas passer un modèle de fonction comme argument.
Dans un cas comme le vôtre, j'utiliserais Boost :: Fonction de type Foncteur. Vous pouvez ensuite transmettre les objets de fonction et les pointeurs de fonction tout en conservant la même interface. P>
Cela n'a pas été répondu parce que vous ne pouvez pas.