3

有没有办法在 main 之外传递 foo_ ?我在另一个关于函子的问题中看到了一些关于 Boost 的信息。看起来它可能会起作用。这是该问题中提到 Boost的答案。如果可以的话,我想避免使用Boost。

#include <iostream>

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

    foo foo_;
    foo_();
    return 0;
}
4

5 回答 5

4

不,当前不允许本地类型进入模板(否则您可以使用 boost 或 std::tr1::function)。但是,您也许可以在 OOP 中进行,其中 Foo 继承了某些东西(具有您的 foo 实现的虚拟 opeator() 函数),而您将 ptr 传递给 Foo 。

于 2009-10-25T08:39:38.997 回答
1

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

于 2009-10-25T11:47:32.050 回答
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;
}
于 2009-10-25T12:23:56.053 回答
0

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

好吧,如果你有一些接受函子作为模板参数的东西,你可以将任何东西传递给它作为函子,尽管我不完全确定这是你所追求的?

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

int main()
{
  foo foo_;
  UseFunctor( foo_ );
}
于 2009-10-25T08:33:10.880 回答
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() 方法。

于 2009-10-25T08:39:48.263 回答