在使用时声明的函数指针

时间:2011-12-20 18:38:35

标签: c++

在javascript中可以执行以下操作:

SomeObject.somefunction(function(someparameters){
//do some things.
});

就像在jquery中的每个函数一样:

$('.rawdata').each(function(index){
$(this).attr('some',index);
});

我搜索并看到在c / c ++中我们可以使用函数指针作为参数使用函数,但是没有找到像上面那样做某事的方法:声明将指向的那一刻的函数它会被使用。这可能吗?如果不是,您会建议使用什么?

5 个答案:

答案 0 :(得分:3)

查看lambda functions,在最新标准(C ++ 11)中添加到C ++中。

std::vector<int> vec;
// ...
// Double each element in the vector
std::transform(vec.begin(), vec.end(), [] (int elem) { return 2*elem; });

接收函数的参数必须是模板(其精确类型将自动从lambda函数本身中扣除),std::function<>(一种类型擦除类,用于保存任何类型的给定原型的“可调用的东西”。

顺便说一下,函数指针不是在C ++ 11标准之前将函数式对象传递给C ++过程的唯一方法:任何重载operator()的对象(即函数调用) operator)可以作为函数调用,并且被称为“函子”。使用STL 1 算法编程时,函数非常普遍。


  1. @nitpickers:我知道,我不在乎,我们都知道我在说什么。

答案 1 :(得分:2)

这是JavaScript中的匿名方法。 C ++没有匿名方法,因此无法复制确切的行为。

如你所说,你可以使用回调,但你必须事先声明它们,而不是在使用它们时。

答案 2 :(得分:1)

C ++ 0x有lambdas可以做同样的事情。

答案 3 :(得分:1)

您可以在C ++ 11中使用lambda函数。例如假设你push_backvector个整数,你可以删除这样的奇数:

vector<int> v;
v.erase(remove_if(v.begin(), v.end(), 
      [] (int e) { return e%2 == 1; }), v.end());

答案 4 :(得分:1)

不能等待C ++ 0x(现在是C ++ 11)?

使用提升。

http://www.boost.org/doc/libs/1_48_0/doc/html/lambda.html