C ++:传递动态函数和存储函数?

时间:2012-02-15 16:08:51

标签: c++ function

我对C ++中的函数有两个问题:你可以在将函数作为引用传递时动态声明一个函数吗?是否可以存储函数以供以后使用?

传递动态功能?

我的问题可能没有完全清楚,但我的意思是在Java中你常常看到类似的代码:

button.addActionListener( new ActionListener( ) 
{
    public void actionPerformed( ActionEvent e )
    {
        System.out.println( "..." );
    }
} );

或JavaScript:

$( ".class" ).each( function( )
{
    alert( "..." );
} );

在C ++中,您只能使用:

void print( )
{
    std::cout << "..." << std::endl;
}

void func( void ( &f )( ) )
{
    f( );
}

// ...

func( print );

并且无法执行类似

的操作
void func( void ( &f )( ) )
{
    f( );
}

// ...

func( void f( ){ ... } );

这只是对C ++的限制吗?

存储功能?

是否可以将类似的函数存储到稍后要调用的容器中?这个想法的一个例子(不起作用)是:

std::vector< void( ) > storage;

void callMeLater( void ( &f )( ) )
{
    storage.push_back( f );
}

void popFunction( )
{
    void f( ) = storage.pop_back( );
    f( );
}

在处理Event系统时,这些想法都出现在我身上,看看我的Timer对象是否也可以处理延迟函数和事件调用。由于我从未在任何C ++代码中看到过这些,我怀疑它们是可能的,但是我希望能够以其他方式显示!

谢谢。

1 个答案:

答案 0 :(得分:2)

根据现行标准,它变得非常容易:

#include <functional>

void foo (std::function<float(float,float)> bar) {
    std::cout << bar (0.5, 0.75);

    std::function<float(float,float)> frob = bar;
}

在尖括号内你声明输出(在这种情况下是一个浮点数)和输入(两个浮点数)。

然后您可以这样称呼它:

float perlin_noise_function (float x, float z) { ... }

class PerlinNoiseFunctor : public std::binary_function<float(float,float)>
{...};

int main () {
    // pass function pointer
    foo (perlin_noise);

    // pass functor
    PerlinNoiseFunctor pnf;
    foo (pnf);

    // pass lambda function
    foo ([] (float x, float z) { ... });
}

您也可以像这样替换foo

template <typename F>
void foo (F f) ;