c++ - 重载本地 lambda 函数

标签 c++ c++11 lambda c++14

我有一个函数,它对于 doubleint 输入几乎是一样的。因此,我重载了这两种类型的函数。不幸的是,在核心方面,doubleint 变体之间存在差异。目前,我为此依赖于重载的“核心”功能。为了提高可读性,我希望将重载(非常短)的核心函数作为函数本身的一部分,例如使用 lambda 函数。

下面这个例子总结了我目前的布局(当然真正的代码要复杂一些)。

#include <iostream>
#include <cstdlib>

double func_core ( double a, double b ) {
  return a*b;
}

int func_core ( int a, int b ) {
  if ( a==b )
    return 1.;
  else
    return 0.;
}

template <class T> T func ( T a, T b ) {
  return func_core(a,b);
}

int main ( void ) {
  std::cout << func(10 ,20 ) << std::endl;
  std::cout << func(10.,20.) << std::endl;
  return 0;
}

出于超出此示例的原因,我使用了 C++14(与此一致,我使用 clang++ -std=c++14 example.cpp 编译了此示例)。

现在,我想去掉核心函数(在本例中为 func_core),因为它会降低代码的可读性。理想情况下,我想使用在函数本身内重载的 lambda 函数。我在下面的示例中总结了我的想法(不起作用)。

template <class T> T func ( T a, T b ) {
  if ( sizeof(T)==sizeof(int) )
    auto func_core = [](int a,int b){ if (a==b) return 1.; else return 0.; };
  else if ( sizeof(T)==sizeof(double) )
    auto func_core = [](double a,double b){ return a*b; };
  else
    throw std::runtime_error("Overload type not allowed");

  return func_core(a,b);
}

这能做到吗?还是我过度拉伸(stretch)了?

最佳答案

不幸的是,无论是使用 C++11 还是 C++14,您都需要使用像 SFINAE 这样的野兽或重载解析来完成您想要的。

但是在 C++17 中,您可以使用 constexpr if 并将所有需要的功能合并到一个函数模板中,如下所示:

template<typename T>
 T func (T const &a, T const &b) {
  if constexpr(std::is_integral<T>::value)
    return (a == b)? 1 : 0;
  else
    return a * b;
}

Live Demo

关于c++ - 重载本地 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43318195/

相关文章:

c++ - 如何在数组对象中传递参数?在 C++ 中

c++ - 新运算符中分配器的平均时间

linq - Lambda 查询按日期对列表进行反向排序

java - 是否可以仅使用 lambda 表达式将字符串转换为 int[]?

lambda - OrElse在 Java8 中获取链接

c++ - 使用 scanf 过滤掉负数

c++ - 无法将数组传递给排序函数(需要对列而不是行进行排序)

c++ - 如何在给定起点和终点的字符串中查找子字符串的出现次数?

c++ - 为什么统一初始化列表功能在 C++ 的 VS2012 中不起作用

用于使用开关展开循环的 C++ 模板?