c++ - 具有模板参数的通用 lambda 函数

标签 c++ lambda c++14

 #include <utility>
 #include <tuple>

 template < typename T, typename U >
 void h(T, U)
 {
 }

 template < typename... T, typename... U >
 void f(std::tuple < T... >  t, std::tuple < U... >  u)
 {
     auto g = [&] < std::size_t... I > (std::index_sequence < I... >)
              {
                  bool const r[]{((void)h(std::get < I >(t), std::get < I >(u)), false)...};
                  (void)r;
             };
     g(std::index_sequence_for < T... >());
 }

 int main()
 {
     f(std::make_tuple(0L, 0LL), std::make_tuple(0UL, 0ULL));
 }

以上使用g++ test_templated_lambda.cpp -o test_templated_lambda -std=c++14 编译,但不使用clang++ test_templated_lambda.cpp -o test_templated_lambda -std=c+ 编译+14

我知道它是一个 GCC 扩展(Using template parameter in a generic lambda),但是有什么方法可以做到这一点而无需将 g 写成一个自由函数

最佳答案

如果没有外部帮助,这是不可能的;通用 lambda 是函数范围内唯一允许的模板形式,它们不能被专门化或重载(没有一些外部帮助器,例如 P0051R1 overload)。

可以通过在函数中嵌入递归通用 lambda 来编写编译时循环,但是 (a) 您必须将其转换为定点组合器形式,并且 ( b) 终止它是非常丑陋的:

[&](auto&& g) {
  g(g, std::integral_constant<std::size_t, 0u>{});
}([&](auto&& g, auto I) {
  h(std::get<I>(t), std::get<I>(u));
  std::get<I + 1 == sizeof...(T)>(std::make_pair(
    [&](auto&& g) { g(g, std::integral_constant<std::size_t, I + 1>{}); },
    [](auto&&){}))(g);
});

Example .

您已经在使用外部辅助工具 (std::index_sequence_for),那么为什么不再写一个呢?例如:

template<class F, std::size_t... I> auto apply_indexes(F&& f, std::index_sequence<I...>) {
  return std::forward<F>(f)(std::integral_constant<std::size_t, I>{}...);
}

用法:

auto g = [&](auto... I)
{
  bool const r[]{((void)h(std::get<I>(t), std::get<I>(u)), false)...};
  (void)r;
};
apply_indexes(g, std::index_sequence_for<T...>());

关于c++ - 具有模板参数的通用 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35359498/

相关文章:

c++ - 获取可调用的输入/输出类型

c++ - 编译器 g++ 无法创建 a.out 文件?

c++ - 下面5行代码会导致内存泄漏吗?

c++ - 缩放旋转剪切反射算法

c++ - 从 lambda 返回对象/右值引用的首选形式

c++ - C++14 中引入的哪些更改可能会破坏用 C++11 编写的程序?

c++ - 如何在C++中创建指针数组

C++ 如何在编译时接受任意长度的对列表?

python - 如何获取 Pandas 数据帧每行中包含预定义等价类值名称的列?

c# - 将多个委托(delegate)添加到 Func<T> 并返回第一个 lambda 委托(delegate) (C#) 的结果?