推导传递给构造函数的lambda返回和参数
Deduce lambda return and arguments passed to constructor
我有以下类:
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();
演示
使用一个模板参数而不是pack的一个缺点可能是难以显式定义Args...
的元组。辅助型特征可用于从Fn
:中获得std::tuple
型
template<typename>
struct Tuple_from_args;
template<typename R, typename... Args>
struct Tuple_from_args<R(Args...)> {
using type = std::tuple<Args...>;
};
相关文章:
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 从 lambda 返回的对象将丢失属性值
- C++ lambda 返回自己
- Lambda 返回空字符串
- 从 lambda 返回变体
- Spirit.X3 与 lambda 返回不同的解析器类型
- 为什么Lambda返回布尔
- 崩溃当std ::函数是从lambda返回的VS 2012中返回的值时的崩溃
- 为什么我不能从 lambda 返回初始值设定项列表
- 为什么对于具有多个返回路径的lambda返回lambda,我会得到一个类型推导错误
- C++11对lambda返回类型的限制
- 编译器警告:无法推导lambda返回类型
- 从lambda返回局部变量到const ref
- 从lambda返回对象/右值ref的首选形式
- Lambda返回Lambda错误地推断返回类型
- 没有clang警告或错误,如果c++ 11 lambda返回错误的类型
- 将函数模板"pass"为泛型可变参数 lambda 返回语句是好方法吗?
- c++ lambda:返回另一个返回另一个函数的函数
- 从lambda返回一个Eigen::Map
- 是我的书吗;s对lambda返回类型的讨论是错误的