重载本地lambda函数

Tom*_*eus 2 c++ lambda c++11 c++14

我有一个几乎相同的功能double和int输入.因此我重载了这两种类型的功能.不幸的是,核心是变体double和int变体之间存在差异.目前,我依赖于一个过载的"核心"功能.为了增强可读性,我希望将重载(非常短)的核心函数作为函数本身的一部分,例如使用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;
}
Run Code Online (Sandbox Code Playgroud)

由于超出此示例的原因,我使用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);
}
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?还是我过度伸展?

101*_*010 5

不幸的是,无论是使用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;
}
Run Code Online (Sandbox Code Playgroud)

现场演示