1

在 C/C++(可能是 C++11 之前的版本)中,是否可以这样做

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

即,一个函数

  1. 从 B 值返回 A 值的函数,
  2. 一个 B 值被馈送到该函数,

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

如果是,会是

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

提前感谢和欢呼,尼克

2014-4-20 (1): 感谢您提及 'evtl.'(固定)std::bind。:-)

所以——要理解——(在没有 Boost 的 C/pre 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 的单个函数/方法处理执行中。

由于不必为每个不同的参数计数使用几乎相同的代码,实际的想法是生成仍未执行的作业,作为所有情况下相同类型的零参数过程。

尽管如此,我还是没有找到如何在函数内部构造或修改函数指针的方法。以某种方式对 Evaluator 进行“类型转换”似乎不切实际,是吗?

再次,非常感谢,复活节快乐...... :-)

4

2 回答 2

5

我想你正在寻找std::bind. 这个名字std::bind是新的,以前它是 Boost 的一部分。

#include <functional>

std::function<A (void)> curry(A (*fn)(B), B b)
{
    return std::bind(fn, b);
}
于 2014-04-19T21:17:04.673 回答
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如果可以的话,请使用。

于 2014-04-20T12:54:16.507 回答