【问题标题】:Non-type template parameter for polymorphic lambda?多态 lambda 的非类型模板参数?
【发布时间】:2016-07-28 08:25:10
【问题描述】:

这样写可以吗?

[](std::index_sequence<std::size_t ...I> s) {

};

还是这个?

[]<std::size_t ...I>(std::index_sequence<I...> s) { 

}

在 C++14 或 C++17 中的语法如何?还是根本不可能?基本上,我只想将I 作为模板参数包,而 lambda 只是作为一种方式来实现。或者,有没有实现以下的语法?

std::index_sequence<std::size_t ...I> x = std::make_index_sequence<10>{};

// I now is a local template parameter pack

【问题讨论】:

标签: c++ polymorphism variadic-templates index-sequence


【解决方案1】:

GCC 提供了后一种语法as an extension,但它不是标准的:

template <typename... Ts>
void foo(const std::tuple<Ts...>& t) {
    auto l = [&t]<std::size_t ...I>(std::index_sequence<I...> s) { 
        std::initializer_list<int>{ (std::cout << std::get<I>(t), 0)... };
    };

    l(std::index_sequence_for<Ts...>{});
}

Live Demo

【讨论】:

    【解决方案2】:

    不完全相同,但也许您可以使用辅助函数推送序列,如下所示:

    #include <functional>
    #include <cstddef>
    #include <iostream>
    
    auto lambda = [](auto... I){
        int arr[] = { (std::cout << I << std::endl, 0)... };
        (void)arr;
    };
    
    template<std::size_t... I>
    constexpr auto f(std::index_sequence<I...>) {
        return lambda(I...);
    }
    
    int main() {
        f(std::make_index_sequence<3>());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2020-05-02
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多