2010-05-14 8 views
1

J'ai une classeComment fonctionne l'appel de cet objet fonction?

class fobj{ 
public: 
    fobj(int i):id(i) {} 

    void operator()() 
    { 
     std::cout<<"Prints"<<std::endl; 
    } 

private: 
    int id; 
}; 

template<typename T> 
void func(T type) 
{ 
    type(); 
} 

Si j'invoque func comme

Méthode 1:

func(fobj(1)); 

le message que je voulais imprimer est imprimé.

Je pensais toujours que je devais faire quelque chose comme

Méthode 2:

fobj Iobj(1); // create an instance of the fobj class 
func(Iobj); // call func by passing Iobj(which is a function object) 

Comment fonctionne Méthode 1? Je veux dire ce qui se passe exactement?

Comment appelez-vous l'opérateur() dans la classe fobj?

Répondre

2

Une chose à noter est que cela fonctionne parce que votre classe de modèle prend un objet en valeur:

template<typename T> 
void func(T type) // this takes a T by value 
... 

à cause de cela, il peut prendre soit une lvalue (comme une variable réelle) ou un rvalue (comme le temporaire).

Si pour une raison quelconque vous ne voulez limiter func seulement prendre une lvalue, vous pouvez modifier la fonction à l'aide passe par référence:

template <typename T> 
void func(T &type) // this takes a T by reference 
... 

à l'aide passe par référence ne permet l'effet secondaire de la fonction être capable de modifier l'objet.

+0

Un avantage de l'affichage dans Stack Overflow est les réponses étonnantes :). Merci –

2

En func(fobj(1)), fobj(1) crée une Temporaire de fobj du littéral int 1. Ce temporaire est utilisé pour initialiser le paramètre de la fonction type (il y a une copie implicite que le compilateur peut elide), et dans le corps de la fonction operator() est invoquée sur l'objet fonction.

Je pense que nommer le paramètre de fonction type est un peu trompeur. type est le nom de l'instance T (dans ce cas un fobj) qui est le paramètre de la fonction.

Questions connexes