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)
可以这样做吗?还是我过度伸展?
不幸的是,无论是使用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)