1

I have a class

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

If I invoke func like

Method 1:

func(fobj(1)); 

the message I wanted to print is printed.

I was always thinking I needed to do something like

Method 2:

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

How does Method 1 work? I mean what exactly happens?

And how is a call made to the operator() in class fobj ?

4

2 に答える 2

2

In func(fobj(1)), fobj(1) creates a temporay fobj from the literal int 1. This temporary is used to initialized the function parameter type (there's an implicit copy which the compiler may elide), and in the body of the function operator() is invoked on the function object.

I think that naming the function parameter type is a bit misleading. type is the name of the T instance (in this case a fobj) that is the function parameter.

于 2010-05-14T23:45:48.780 に答える
2

注意すべき点の1つは、テンプレートクラスがオブジェクトを値で取得しているため、これが機能することです。

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

このため、左辺値(実際の変数など)または右辺値(一時変数など)のいずれかを取ることができます。

何らかの理由funcで左辺値のみを取得するように制限したい場合は、参照渡しを使用するように関数を変更できます。

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

参照渡しを使用すると、関数がオブジェクトを変更できるという副作用が発生します。

于 2010-05-14T23:54:03.907 に答える