2012-02-15 49 views
1

我有两个有关C++中的函数的问题:当您将它作为参考传递时,是否可以动态地声明一个函数?是否可以存储稍后使用的函数?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++的限制吗?

存储函数?

是否有可能将类似的函数存储到稍后调用的容器中? (不工作)的想法的一个例子是:事件系统上工作时,要看看我的Timer对象还可以处理延迟功能,以及事件调用

std::vector< void() > storage; 

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

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

这些想法都来找我。正如我从未见过这些在任何C++代码中使用过的那样,我怀疑它们是可能的,但愿意以其他方式显示!

谢谢。

回答

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

哦,哇。这正是我所期待的。谢谢你。 – ssell 2012-02-15 16:21:50