C++ 简化类';s方法';它有多种定义

C++ 简化类';s方法';它有多种定义,c++,coding-style,C++,Coding Style,我有几个类的方法彼此非常相似。它们只是在向方法添加其他参数时有所不同。基本方法有七个参数 以下是我当前的代码: void Noise::calcFBM(float* arr, int xsize, int ysize, int startOct, int endOct, double amp, double freq) { //Calculate Fractal Brownian Motion } void Noise::calcFBM(float* arr, int xsiz

我有几个类的方法彼此非常相似。它们只是在向方法添加其他参数时有所不同。基本方法有七个参数

以下是我当前的代码:

void Noise::calcFBM(float* arr, int xsize, int ysize,
    int startOct, int endOct, double amp, double freq)
{
    //Calculate Fractal Brownian Motion
}

void Noise::calcFBM(float* arr, int xsize, int ysize,
    int startOct, int endOct, double amp, double freq,
    std::function<float (float)> modifier)
{
    //Calculate Fractal Brownian Motion
    //Apply modifier (lambda function taking (value)) to each point
}

void Noise::calcFBM(float* arr, int xsize, int ysize,
    int startOct, int endOct, double amp, double freq,
    std::function<float (float, float, float)> modifier)
{
    //Calculate Fractal Brownian Motion
    //Apply modifier (lambda function taking (value, xPos, yPos)) to each point
}
void Noise::calcFBM(float*arr、int-xsize、int-ysize、,
int startOct、int endOct、双放大器、双频)
{
//计算分形布朗运动
}
无效噪音::calcFBM(浮点*arr,int-xsize,int-ysize,
int startOct,int endOct,双放大器,双频率,
std::函数修饰符)
{
//计算分形布朗运动
//将修改器(lambda函数取值(值))应用于每个点
}
无效噪音::calcFBM(浮点*arr,int-xsize,int-ysize,
int startOct,int endOct,双放大器,双频率,
std::函数修饰符)
{
//计算分形布朗运动
//将修饰符(lambda函数取值(值、xPos、yPos))应用于每个点
}
我想为每一个将添加一个结构或四个浮点(可能是结构,以减少参数数量)的变量添加一个变量


我是否应该通过只使用带有大多数参数的函数来简化,尽可能地设置默认值,并强制程序员设置其余参数

是,使用默认参数。由于
修饰符
参数的类型会有所不同,因此需要按如下方式对其进行模板设置:

template <typename Func = std::function<float(float, float, float)> >
void calcFBM(float* arr, int xsize, int ysize,
    int startOct, int endOct, double amp, double freq,
    Func modifier = [](float x, float y, float z){return id;})
{
}
模板
void calcFBM(float*arr、int-xsize、int-ysize、,
int startOct,int endOct,双放大器,双频率,
Func修饰符=[](浮点x,浮点y,浮点z){return id;})
{
}

请修改默认lambda,以返回与identity修饰符函数对应的任何值,即不带修饰符的第一个重载的值。

显示代码please@Christophe发布一个简化版就可以了,对吧?@Numeri绝对可以。太棒了!最后两个变量是否仅转换第一个函数的结果(即从数学上讲,
calcFBM3=calcFBM1 o修饰符
)?@Christophe Yes。有更好的方法吗?啊,这很有道理!我想知道是否需要模板,但坦率地说,我没有充分使用它们。我会在几分钟内接受你的回答,因为它完全符合我的问题,但当然我不想阻止任何进一步的回答,以防有更好的方法。多谢各位@另外,如果您只关心一小部分可能的
Func
s,则可以显式地实例化它们。这允许您在源文件中保留函数定义。不,我希望它对程序员希望传递的任何修改器保持打开状态。实际上,这并不像我希望的那样完全有效。这不允许取消Func参数,也不允许Func的类型为
std::function
。我相信这是由于使用修饰符的模板函数中的行:如果我传递三个参数(value、x和y),则需要三个,并且它必须存在。有什么办法吗?@Numeri啊,是的,我明白你的意思-这确实是一个令人讨厌的情况。一种方法是创建一个helper函数,该函数修改
modifier
,以确保它具有所需的arity。它将通过简单地添加未使用的伪参数来实现这一点,允许您始终说
modified_modifier(x,y,z)
,即使
modifier
float(float)
。这够好吗?