使用 decltype(lambda) 的 C++/可变参数模板和参数包
C++ / variadic template & parameter pack using decltype(lambda)
很抱歉问了一个以前可能会被问到的问题,但我搜索了足够长的时间并没有找到答案。
我的问题是我想调用类型为 template <typename GenericLambda, typename... LambdaArgs>
的模板函数,而不需要总是在模板参数中先写 decltype(my_lambda)
。
#include <functional>
#include <string>
template <typename GenericLambda, typename... LambdaArgs>
auto lambda_to_mem_fn() {
auto ptr = &GenericLambda::template operator() < LambdaArgs... > ;
auto as_mem_fn = std::mem_fn(ptr);
return as_mem_fn;
}
auto my_lambda = [](auto x, auto y) { return x + y; };
// imaginary function
template <????>
auto make_lambda_to_mem_fn(GenericLambda generic_lambda)
{
// Extract lambda args types and forward them to lambda_to_mem_fn
using GenericLambda = decltype(generic_lambda);
lambda_to_mem_fn<GenericLambda, LambdaArgs...>();
}
void test() {
// How to remove the need to write decltype(my_lambda) ?
auto as_mem_fn = lambda_to_mem_fn<decltype(my_lambda), int, int>;
// I would like to write:
auto as_mem_fn2 = make_lambda_to_mem_fn<int, int>(my_lambda);
}
我需要一个可移植的解决方案(即适用于 gcc、clang 和 msvc)。
我已经挠头很久了,希望能得到一些帮助 ;-)
Link 到编译器资源管理器片段:
https://godbolt.org/z/pFk09J
参数包(如果存在)必须是模板参数列表中最后一个参数的限制仅适用于主要 class 模板。如果类型可以推导或者默认,可以出现在参数包后面:
template <typename... LambdaArgs, typename GenericLambda>
auto make_lambda_to_mem_fn(GenericLambda generic_lambda)
{
return lambda_to_mem_fn<GenericLambda, LambdaArgs...>();
}
任何模板参数都将由 LambdaArgs
使用,而 GenericLambda
将从参数表达式中推导出来。
很抱歉问了一个以前可能会被问到的问题,但我搜索了足够长的时间并没有找到答案。
我的问题是我想调用类型为 template <typename GenericLambda, typename... LambdaArgs>
的模板函数,而不需要总是在模板参数中先写 decltype(my_lambda)
。
#include <functional>
#include <string>
template <typename GenericLambda, typename... LambdaArgs>
auto lambda_to_mem_fn() {
auto ptr = &GenericLambda::template operator() < LambdaArgs... > ;
auto as_mem_fn = std::mem_fn(ptr);
return as_mem_fn;
}
auto my_lambda = [](auto x, auto y) { return x + y; };
// imaginary function
template <????>
auto make_lambda_to_mem_fn(GenericLambda generic_lambda)
{
// Extract lambda args types and forward them to lambda_to_mem_fn
using GenericLambda = decltype(generic_lambda);
lambda_to_mem_fn<GenericLambda, LambdaArgs...>();
}
void test() {
// How to remove the need to write decltype(my_lambda) ?
auto as_mem_fn = lambda_to_mem_fn<decltype(my_lambda), int, int>;
// I would like to write:
auto as_mem_fn2 = make_lambda_to_mem_fn<int, int>(my_lambda);
}
我需要一个可移植的解决方案(即适用于 gcc、clang 和 msvc)。
我已经挠头很久了,希望能得到一些帮助 ;-)
Link 到编译器资源管理器片段: https://godbolt.org/z/pFk09J
参数包(如果存在)必须是模板参数列表中最后一个参数的限制仅适用于主要 class 模板。如果类型可以推导或者默认,可以出现在参数包后面:
template <typename... LambdaArgs, typename GenericLambda>
auto make_lambda_to_mem_fn(GenericLambda generic_lambda)
{
return lambda_to_mem_fn<GenericLambda, LambdaArgs...>();
}
任何模板参数都将由 LambdaArgs
使用,而 GenericLambda
将从参数表达式中推导出来。