我对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 ++代码中看到过这些,我怀疑它们是可能的,但是我希望能够以其他方式显示!
谢谢。
答案 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) ;