有没有办法在主外部传递foo_?我在另一个关于仿函数的问题中看到了关于Boost的一些信息看起来它可能会起作用。这是回答在这个问题中提到Boost的问题。如果可以,我想避免升压。

#include <iostream>

int main()
{
    class foo {
        public:
        void operator()() {
            std::cout << "Hello" << std::endl;
        }
    };

    foo foo_;
    foo_();
    return 0;
}
有帮助吗?

解决方案

不,目前本地类型不允许进入模板(否则你可以使用boost或std :: tr1 :: function)。但是,你可以做OOP,Foo继承了一些东西(你的foo实现了一个虚拟的opeator()函数),你将ptr传递给Foo。

其他提示

函数本地类不能用作模板参数,如果这是你的意思。这只能由C ++ 0x支持。

似乎可以使用本地类的静态函数的地址。但是,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;
}

我认为不可能调用当前作用域中未定义的类的成员。在这种情况下,仿函数不保留任何状态,其行为类似于不带参数且不返回任何值的函数,因此您可以将其实例分配给原始函数指针。但是,它不再是 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()方法。

编辑:这似乎不是有效的C ++,尽管有些编委会毫无怨言地接受它。

如果你有一些接受仿函数作为模板参数的东西,你可以将任何东西传递给它作为一个仿函数,虽然我不完全确定你是在追求它吗?

template< class tFunctor >
void UseFunctor( const tFunctor& func )
{
  func();
}

int main()
{
  foo foo_;
  UseFunctor( foo_ );
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top