gpt4 book ai didi

c++ - 推导lambda返回并将参数传递给构造函数

转载 作者:行者123 更新时间:2023-12-03 06:58:31 25 4
gpt4 key购买 nike

我有以下类(class):

template<typename R, typename... Args>
class Callable final
{
public:
Callable(void* args, R(*fn)(Args...));
Callable(void* args, std::function<R(Args...)> &&fn);

/* parse args into a tuple<Args...> and invoke callable */
void* invoke();

private:
void* args;
std::function<R(Args...)> callable;
};
我可以像这样使用它:
void* test(void* a, const char* b, const char* c)
{
return nullptr;
}

Callable(args, test).invoke();
Callable(args, std::function([](void* a, void* b, void* c){})).invoke();
但是它不允许我这样做:
Callable(args, [](void* a, void* b, void* c){}).invoke();
//No viable constructor or deduction guide for deduction of template arguments of 'Callable'
我必须将 lambda包装在 std::function中。有没有一种方法可以让我的类直接接受一个lambda并将其存储为 std::function,而不必显式指定 std::function(lambda)作为构造函数参数?
我不想做 Callable(args, std::function([](void* a, void* b, void* c){})).invoke();,它将lambda显式地包装在函数中。我想直接传递lambda,并让构造函数在内部将其存储为函数。
我怎样才能做到这一点?

最佳答案

如果允许我们修改Callable的模板签名以使用单个参数来删除Args...包,我们可以编写自己的Callable推导指南:

template<typename Fn>
class Callable final {
public:
Callable(void* args, std::function<Fn>&&);

void* invoke();

private:
void* args;
std::function<Fn> callable;
};

template<typename>
struct Get_fn_type;

template<typename R, typename C, typename... Args>
struct Get_fn_type<R(C::*)(Args...) const> {
using type = R(Args...);
};

template<typename R, typename C, typename... Args>
struct Get_fn_type<R(C::*)(Args...)> { // for mutable lambdas
using type = R(Args...);
};

template<class Fn>
Callable(void*, Fn) -> Callable<
typename Get_fn_type<decltype(&Fn::operator())>::type>;

template<class Fn>
Callable(void*, Fn*) -> Callable<Fn>;
现在我们可以做:
Callable(args, test).invoke();
Callable(args, std::function([](void* a, void* b, void* c){})).invoke();
Callable(args, [](void* a, void* b, void* c) {}).invoke();
Callable(args, [](void* a, void* b, void* c) mutable {}).invoke();
Demo

使用一个模板参数代替pack的一个缺点可能是难以明确定义 Args...元组。可以使用帮助程序类型特征从 std::tuple获取 Fn类型:
template<typename>
struct Tuple_from_args;

template<typename R, typename... Args>
struct Tuple_from_args<R(Args...)> {
using type = std::tuple<Args...>;
};

关于c++ - 推导lambda返回并将参数传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64782121/

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