有没有办法在主外部传递foo_?我在另一个关于仿函数的问题中看到了关于Boost的一些信息看起来它可能会起作用。这是answer在这个问题中提到的Boost。如果可以,我想避免升压。
#include <iostream>
int main()
{
class foo {
public:
void operator()() {
std::cout << "Hello" << std::endl;
}
};
foo foo_;
foo_();
return 0;
}
答案 0 :(得分:4)
不,目前本地类型不允许进入模板(否则你可以使用boost或std :: tr1 :: function)。但是,你可以做OOP,Foo继承了一些东西(你的foo实现了一个虚拟的opeator()函数),你将ptr传递给Foo。
答案 1 :(得分:1)
函数本地类不能用作模板参数,如果这是你的意思。这只能由C ++ 0x支持。
答案 2 :(得分:1)
似乎可以使用本地类的静态函数的地址。但是,operator()必须是非静态成员函数,因此您需要为其命名:
#include <iostream>
template <class T>
void bar(T f)
{
f();
}
int main()
{
class foo {
public:
static void do_it() {
std::cout << "Hello" << std::endl;
}
};
bar(&foo::do_it);
return 0;
}
答案 3 :(得分:0)
编辑:这似乎不是有效的C ++,尽管有些编委会毫无怨言地接受它。
如果你有一些接受仿函数作为模板参数的东西,你可以将任何东西传递给它作为一个仿函数,虽然我不完全确定你是在追求它吗?
template< class tFunctor >
void UseFunctor( const tFunctor& func )
{
func();
}
int main()
{
foo foo_;
UseFunctor( foo_ );
}
答案 4 :(得分:0)
我认为不可能调用当前作用域中未定义的类的成员。在这种情况下,仿函数不保留任何状态,其行为类似于不带参数且不返回任何值的函数,因此您可以将其实例分配给原始函数指针。但是,它不再是 foo :它只是一个函数指针。
一种解决方案是从全局范围内定义的纯虚基类派生 foo ,例如:
class base
{
public:
void operator()() { doit(); }
protected:
virtual void doit() = 0;
};
int main()
{
class foo
{
public:
void operator()() { doit(); }
protected:
virtual void doit()
{
std::cout << "Hello" << std::endl;
}
};
}
您现在可以将 foo 的实例作为 base 传递,并且将按预期调用虚拟doit()方法。