我有一个编程问题,我想了好几天,但仍然没有好的解决方案。
有几个大的,长的,类似的功能,其中只有几行不同。例如:
void bigfunc(){
//blabla..
double i, j, k;
double result;
//only this part is different
{ result=i++; } //in bigfunc1;
{ result=i*cos(j);} //in bigfunc2;
{ result=sin(i)*cos(j)*tan(k);} //in bigfunc3;
//blabla...
}
最简单的方法是复制 bigfunc 3 次并分别编辑不同的行。显然,这不是一个好主意。
现在,我选择了c++中的模板函数方法,它将不同的行包含在几个小函数中,例如:
< template class F >
void bigfunc(F& f){
...
f(i,j,k); //call the function.
...
}
void f1(int i, int j, int k){
i++; //only use parameter i!
}
void f2(int i, int j, int k){
i++; j++; //only use parameter i and j!
}
void f3(int i, int j, int k){
i++; j++; j++;
}
但是,我们必须统一 f(int, int, int) 的原型,以将所有输入参数包含在三个不同的 bigfunc 中,而实际上,例如在 bigfunc1 中,确实只需要 f(int i)。因此,这种方法似乎不够优雅。
我认为,如果有一些抽象机制可以将句子块作为函数参数或模板函数参数。那将是惊人的!例如(伪代码):
< template class Code>
void bigfunc(Code code){
//...
code(); //direct expand the code in place, which will be amazingly beautiful.
//....
}
code1(){
i++; //just be care for the variable name, like #include
}
....
任何语言中是否还有其他一些编译器时抽象机制可以优雅地解决此类问题。
到目前为止,我只听说D语言的static_if也许可以解决这种情况。例如:
< template class F>
void bigfunc(F f){
if( static_if(f) == func1 ) //it is justified at compile-time, not at run-time.
i++;
else if ( static_if(f)==func2){
i++; j++;
}...
}
对不起,我不知道 D,这只是为了解释。
感谢您的任何建议!