9
votes

Opérateur modélisé () Surcharge C ++

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. 


1 commentaires

Cela n'a pas été répondu parce que vous ne pouvez pas.


3 Réponses :


14
votes

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


4 commentaires

@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 _ est discutable dans ce scénario. Modifié la réponse en conséquence.



0
votes
#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)

1 commentaires

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.



1
votes

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.


0 commentaires