0

我正在尝试创建一个可延迟的调用对象。类似于(伪代码)的东西:

template <class FN>
struct delayable_call
{
    return-type-of-FN call(); // <-- I'd like to use result_of here.

    template<class ArgTypes...>
    delayable_call(FN* pFn, ArgTypes... args);

    FN* fn;
    args-saving-struct;
};

我尝试使用 result_of::type 作为调用的返回类型,但在模板的实例化过程中出现错误,因为显然需要单独指定参数类型。

实例化:

int foo(bool, double); // function prototype.

delayable_call<int(bool, double)> delayable_foo(foo, false, 3.14); // instantiation

我读过的有关 result_of 的错误消息和文档似乎表明还必须指定参数类型。因此result_of<FN>::type,我需要指定result_of<FN(bool, double)>::type. 这确实解决了我遇到的编译问题,但打破了模板的通用性。

那么,当模板参数表示函数签名时,如何将 result_of 与模板参数一起使用?

4

1 回答 1

1
template <class FN> struct delayable_call;
template<class R, class...Args> delayable_call<R(Args...)>{
  typedef R(*)(Args...) pFN;

用专业化替换您delayable_call的,您将同时提取RArgs...。您Args...无论如何都需要存储参数。

但是,库强度的可延迟调用最终将使用类型擦除。最简单的方法是将std::function<R()>lambda 推入其中:

int foo(double);
double x = 7;
std::function<int()> delayed_foo = [x]{ return foo(x); }

并按价值捕获,除非你真的,真的是想通过引用来捕获。

您可以通过以下方式推断R

template<typename Fn, typename... Args>
std::function< typename std::result_of<Fn(Args...)>::type()>
make_delayed_call( Fn&& fn, Args&&... args ) {
  return [=]{ return fn(std::move(args)...); }
}

R这应该从可调用对象和参数中推断出你的。这通过复制捕获所有内容——通过移动捕获需要更多样板文件或 C++14。

于 2014-01-02T19:29:59.060 回答