【问题标题】:C++ / variadic template & parameter pack using decltype(lambda)使用 decltype(lambda) 的 C++/可变参数模板和参数包
【发布时间】:2018-12-09 18:28:27
【问题描述】:

很抱歉问了一个以前可能被问过的问题,但我搜索了足够长的时间并没有找到答案。

我的问题是我想调用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)。

我在这方面已经摸不着头脑了,希望能得到一些帮助;-)

编译器资源管理器 sn-p 的链接: https://godbolt.org/z/pFk09J

【问题讨论】:

  • "无需总是编写 decltype(my_lambda)" - 为什么这是个问题?
  • 因为我正在编写一个库,我想让它的 API 尽可能易于使用
  • typename GenericLambda放在 typename... LambdaArgs之后,即&lt;???&gt;=&lt;typename... LambdaArgs, typename GenericLambda&gt;
  • @PiotrSkotnicki :哎呀,我累了!非常感谢。我什至不敢把包放在第一位,尽管这是解决办法。
  • @PiotrSkotnicki :如果您对代表点感兴趣,请发表答案,我会接受。

标签: c++ templates c++14 variadic-templates decltype


【解决方案1】:

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

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

任何模板参数都将被LambdaArgs 使用,而GenericLambda 将从参数表达式中推导出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多