繁体   English   中英

使用 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)。

在这方面有一段时间以来我一直在挠头,希望得到一些帮助;-)

链接到编译器资源管理器片段: https : //godbolt.org/z/pFk09​​J

参数包(如果存在)必须是模板参数列表中的最后一个参数的限制仅适用于主类模板。 如果类型可以推导或默认,它可以出现在参数包之后:

template <typename... LambdaArgs, typename GenericLambda>
auto make_lambda_to_mem_fn(GenericLambda generic_lambda) 
{
    return lambda_to_mem_fn<GenericLambda, LambdaArgs...>();
}

任何模板参数会被消耗LambdaArgs ,而GenericLambda从参数表达式来推断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM