我有一个函数,它对于 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;
}
出于超出此示例的原因,我使用了 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;
}
关于c++ - 重载本地 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43318195/