gpt4 book ai didi

C++ : Pass Dynamic Functions and Store Functions?

转载 作者:行者123 更新时间:2023-11-30 04:29:31 25 4
gpt4 key购买 nike

关于 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( );
}

我在处理事件系统时想到了这些想法,看看我的 Timer 对象是否也可以处理延迟函数和事件调用。因为我从未在任何 C++ 代码中看到过这些,所以我怀疑它们是否可行,但希望以其他方式显示!

谢谢。

最佳答案

按照目前的标准,这已经变得非常容易了:

#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 )和输入(两个 float )。

你可以这样调用它:

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) ;

关于C++ : Pass Dynamic Functions and Store Functions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com