2014-04-19 108 views
1

在C/C++(可能预C++ 11),是有可能做C/C++:A(* eval(A(* function)(B),B b))(){...}可能吗? (可能预C++ 11)

A (*eval(A (*function)(B), B b))(){ 
    // ... ?? 
} 

即,功能服用

  1. 的函数从B值返回的A值,
  2. B值被馈送到功能,

返回 - 的函数从返回一个A() ... ??

如果是的话,那会是

  • 高效?
  • 保证编译器生成代码 在调用返回函数之前不会执行?

在预先感谢&欢呼声,尼克

2014年4月20日(1): 'evtl' 感谢提(固定)的std ::绑定。 :-)

所以 - 理解 - (在C /预C++ 11不升压)函数指针是例外的方式中,内功能,它是只能够声明它们,但有没有办法产生或修改实例 - 作为函数/方法定义为函数指针实例唯一可能来源,从那里它们可以通过任一被切换明确地,或通过功能/方法参数? ?

只是问,因为我不清楚函数指针的一个可能的内部表示...

2014年4月20日(2):随着Danvil的贡献,它的时间为目的,以揭示,同样在这里用的模板:

template<typename T,typename A> 
struct Evaluator { 
    T(*f)(A); 
    A a; 
    T operator()() const { return f(a); } 
}; 

template<typename T,typename A> 
Evaluator<T,A> eval(T(*f)(A), A a) { 
    Evaluator<T,A> w; 
    w.f= f; w.a= a; 
    return w; 
} 

这工作,而 - 因为有些已经可以猜到 - 总体来说,从任意匹配函数/参数的集合,是为了被作为一个零参数的过程变成一个单一的功能/方法处理类似于try/catch的执行。

对于不必为每个不同的参数数量使用大部分相同的代码,实际的想法是将所有情况下的相同类型的零参数过程生成为尚未执行的作业。

但是,我没有找到一种方法来构造或修改函数内的函数指针; '以某种方式来评估'typecasting'似乎不切实际,是吗?

再次感谢了很多,复活节快乐... :-)

+2

C/C++不存在。 (“evtl.”是什么意思?) –

+0

@AlanStokes evtl.意味着事件。 – Vallentin

+0

(“Evtl.”是德语单词“eventuell”的缩写,在这种情况下意思是“可能”或“可选地”。) –

回答

5

我认为你正在寻找std::bind。名称std::bind是新的,以前它是Boost的一部分。

#include <functional> 

std::function<A (void)> curry(A (*fn)(B), B b) 
{ 
    return std::bind(fn, b); 
} 
+0

添加例子,你会有一个upvote;注意TR1绑定 – sehe

+1

+1,但我认为你想'std :: function '。 – hvd

+0

@ hvd:是的,我喜欢。修正并感谢。 –

0

没有C++ 11它可以工作是这样的:

typedef A(*Func)(B); 

struct Evaluator { 
    Func f; 
    B b; 
    A operator()() const 
    { return f(b); } 
}; 

Evaluator eval(Func f, B b) { 
    Evaluator w; 
    w.f = f; 
    w.b = b; 
    return w; 
} 

这基本上就是std::bind是干什么的,所以如果你可以使用std::bind

+0

非常感谢 - 前进了一步......它让我延伸了这个问题...... :-) – user1566867

相关问题