我有一个班级
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中调用operator()?
答案 0 :(得分:2)
在func(fobj(1))
中,fobj(1)
从文字fobj
创建临时int
1.此临时用于初始化函数参数type
(有一个在函数对象上调用函数operator()
的正文中的编译器可能忽略的隐式副本。
我认为命名函数参数type
有点误导。 type
是T
实例的名称(在本例中为fobj
),它是函数参数。
答案 1 :(得分:2)
有一点需要注意,这是有效的,因为您的模板类按值获取对象:
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
...
使用pass by reference确实允许函数的副作用能够修改对象。