我有一个功能,它几乎相同的double
和int
输入。因此我已经重载了这两种类型的函数。不幸的是,在核心上,double
和int
变体之间存在差异。目前,我依赖于一个超载的'核心'功能。为了提高可读性,我希望将超载(非常短)的核心功能作为函数本身的一部分,例如使用lambda
函数。过载本地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);
}
可以这样做吗?还是我过度伸展?
那么如果'sizeof(T)== sizeof(int)'但T'是* not *'int'(例如它可能是'float')呢?可读性和可维护性如何?你可以详细说明*为什么*你想删除'func_core'重载?什么是将解决的实际问题? –
@Someprogrammerdude。公平点,我增加了一个例外。至于我为什么要这样做,我有许多属于同一功能的“核心”功能(因为它们是相似的,但略有不同)。所提出的方法将避免暗示这些“核心”功能是可重复使用的实体。 –
我建议你使用http://en.cppreference.com/w/cpp/language/partial_specialization – tty6