Как работает вызов этого функционального объекта? - PullRequest
1 голос
/ 15 мая 2010

У меня есть класс

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();
}

Если я призываю func как

Метод 1:

func(fobj(1)); 

сообщение, которое я хотел напечатать, напечатано.

Я всегда думал, что мне нужно сделать что-то вроде

Метод 2:

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

Как работает метод 1? Я имею в виду, что именно происходит?

А как осуществляется вызов оператора () в классе fobj?

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

Следует отметить, что это работает, потому что ваш шаблонный класс принимает объект по значению:

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

из-за этого он может принимать либо lvalue (например, действительную переменную), либо rvalue (например, временную).

Если по какой-то причине вы хотите ограничить func только взятием lvalue, вы можете изменить функцию для использования передачи по ссылке:

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

Использование передачи по ссылке позволяет побочному эффекту функции изменять объект.

2 голосов
/ 15 мая 2010

В func(fobj(1)), fobj(1) создает временное значение fobj из литерала int 1. Это временное значение используется для инициализации параметра функции type (существует неявная копия, которую может исключить компилятор), и в теле функции operator() вызывается из объекта функции.

Я думаю, что наименование параметра функции type немного вводит в заблуждение. type - это имя экземпляра T (в данном случае fobj), который является параметром функции.

...