【发布时间】:2017-04-10 08:26:36
【问题描述】:
我有一个与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);
}
这可以吗?还是我过度拉伸了?
【问题讨论】:
-
如果
sizeof(T) == sizeof(int)但T不是不是int(例如可能是float)怎么办?可读性和可维护性如何?您能否详细说明为什么要删除func_core重载?将解决的实际问题是什么? -
@Someprogrammerdude。公平点,我添加了一个例外。至于我为什么想要这个,我有许多这些“核心”功能一次属于一个功能(因为它们相似,但略有不同)。提议的方法将避免这些“核心”功能是可重用实体的建议。