C++ 在c+;中有没有一种方法可以替换方法中的函数+;

C++ 在c+;中有没有一种方法可以替换方法中的函数+;,c++,algorithm,C++,Algorithm,所以我要做的是做一个函数来分析算法,包括它们的交换数和比较数,现在我面临的问题是我需要重用这个函数,但是为了分析算法,我需要调用每个算法函数 以下是函数的代码: bool flag = false; for (int i = 0; i < 6; i++) { if (!flag) { selectionSort(bigArray[i], 100); printData(fileNames

所以我要做的是做一个函数来分析算法,包括它们的交换数和比较数,现在我面临的问题是我需要重用这个函数,但是为了分析算法,我需要调用每个算法函数

以下是函数的代码:

    bool flag = false;
    for (int i = 0; i < 6; i++)
    {
        if (!flag)
        {
            selectionSort(bigArray[i], 100);
            printData(fileNames[i],swaps,comparisons);
            comparisons = 0;
            swaps = 0;
            flag = true;
        }
        else
        {
            selectionSort(bigArray[i], 1000);
            printData(fileNames[i],swaps,comparisons);
            comparisons = 0;
            swaps = 0;
            flag = false;
        }
    } 
bool标志=false;
对于(int i=0;i<6;i++)
{
如果(!标志)
{
selectionSort(bigArray[i],100);
打印数据(文件名[i]、交换、比较);
比较=0;
互换=0;
flag=true;
}
其他的
{
selectionSort(bigArray[i],1000);
打印数据(文件名[i]、交换、比较);
比较=0;
互换=0;
flag=false;
}
} 

现在您看到selectionSort在哪里了,我需要用插入、快速、堆、合并和计数来替换它。我可以在main中一遍又一遍地编写代码并替换排序函数,但我认为应该有某种解决方案来实现这一点。我就是找不到它,我想做一个函数,把另一个函数作为参数,但是再一次,一些算法函数取2或3,当你这样做的时候,你不能只做
void分析算法(void(*函数)(int*,int,int,intx=0)).
任何帮助都将不胜感激,请提前感谢

您可以将代码包装在函数模板中,使用可变参数集,并在匹配的
Fn
可调用参数上转发(我省略了一些不相关的内容):


请参阅。

拥有函数的签名会有所帮助,因此我将假定变量类型和参数。如果您希望获得更完整的解决方案,请编辑您的问题,添加实际相关数据以解决您的问题

可以将要替换的函数作为参数传递

template<typename F>
void yourAlgorithm(char const** fileNames, int** bigArray, F function) {
    bool flag = false;
    for (int i = 0; i < 6; i++)
    {
        if (!flag)
        {
            function(bigArray[i], 100);
            printData(fileNames[i],swaps,comparisons);
            comparisons = 0;
            swaps = 0;
            flag = true;
        }
        else
        {
            function(bigArray[i], 1000);
            printData(fileNames[i],swaps,comparisons);
            comparisons = 0;
            swaps = 0;
            flag = false;
        }
    }
}

为什么不能使用函数指针?如果您的问题是有些函数使用两个参数,有些函数使用三个参数,则可以将第三个参数设置为可选参数,并在需要时忽略它。另一个选项是使函数具有可变模板参数包,并将其转发到匹配的
std::function
参数。@Alex如果我使用指针函数,正如我所说,有些算法需要2到3次。C++编译强制您实现函数(BigAld[i],100,E.E.E.E.E.E.E.E.T.)的参数,可以使用面向对象的解决方案。使用virtual sort()方法创建抽象分类器类。派生特定的HeapSort、MergeSort、InsertionSort类,这些类在其构造函数中采用不同的参数。为每个应用程序实现sort()。然后对特定的实例化传递并调用sort()。@JulioRosario如果也能看到函数的签名就好了。什么是
bigArray
,等等?据我所知,OP的问题是如何使用不同数量的参数调用排序算法(函数)。这需要暗示一个可变参数包。@Guillaume Racicot您的参数是正确的(:。然而user0042是正确的,函数用于不同数量的参数。我喜欢在这里使用方法的模板,但是指向
char*
的指针和指向
int*
的指针并不是传递数组引用的非常干净的方法…@caps我知道。但是正如我所说的,我试图猜测变量的类型ed.正如他在第二条评论中指出的那样,我对他的类型很在行。我可以建议不要使用
std::function
,而只使用普通的模板参数吗?现在它需要
Args
来完美匹配参数,不允许转换。如果用简单的模板参数替换
std::function
例如,转换将发生,并且可能会轻得多。
std::function
为您提供了类型强制(根据您的用例,可以是好的,也可以是坏的),但它也为您提供了额外的间接寻址和堆分配。@GuillaumeRacicot感谢您的建议。我现在使用普通模板参数简化了代码示例,而不是使用
std::function
int main() {
    sort_tester(selectionSort);

    sort_tester(mergeSort,42);
}
template<typename F>
void yourAlgorithm(char const** fileNames, int** bigArray, F function) {
    bool flag = false;
    for (int i = 0; i < 6; i++)
    {
        if (!flag)
        {
            function(bigArray[i], 100);
            printData(fileNames[i],swaps,comparisons);
            comparisons = 0;
            swaps = 0;
            flag = true;
        }
        else
        {
            function(bigArray[i], 1000);
            printData(fileNames[i],swaps,comparisons);
            comparisons = 0;
            swaps = 0;
            flag = false;
        }
    }
}
int n = 2;
yourAlgorithm(fileNames, bigArray, selectionSort);
yourAlgorithm(fileNames, bigArray, mergeSort);
yourAlgorithm(fileNames, bigArray, [n](int* a, int x){ /* do stuff with a, b and n */ });