gpt4 book ai didi

c++ - 有人可以解释如何在模板中使用 result_of 吗?

转载 作者:行者123 更新时间:2023-11-28 07:11:35 26 4
gpt4 key购买 nike

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

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 与模板参数一起使用?

最佳答案

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。

关于c++ - 有人可以解释如何在模板中使用 result_of 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com