2017-10-17 71 views
2

所以我想要做的是让函数分析算法,包括它们的交换和比较次数,现在我面临的问题是我需要重用这个函数,但为了分析我需要调用每个算法函数的算法。有没有办法替换C++中的方法中的函数

下面是函数的代码:

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; 
     } 
    } 

现在你看到选择排序是我需要来取代它,以插入,快速,堆,合并计算。我可以在main中重复编写代码并替换排序函数,但我认为应该有某种解决方案来完成此操作。我只是无法找到它,我曾想过创建一个函数,将另一个函数作为参数,但是再一次,其中一些算法函数需要2个其他3个函数,并且在执行此操作时,您不能只执行void analyzeAlgorithms(void (*function)(int*, int, int, int x = 0)).任何帮助将不胜感激在此先感谢

+0

为什么你不能使用函数指针?如果你的问题是你的一些函数需要两个,一些需要三个参数,你可以使第三个参数是可选的,并在需要时忽略它。 – Alex

+0

另一种选择是使函数具有可变参数模板参数包,并将其转发给匹配的'std :: function'参数。 – user0042

+0

@Alex如果我使用指针函数,正如我所说的一些算法需要2或3个。 C++编译迫使你实现参数\t函数(bigArray [i],100,????????)。 –

回答

2

可以在拍摄参数可变参数集合函数模板内包装你的代码,并转发上匹配Fn可调用的参数(我省略了一些无关紧要的东西):

#include <iostream> 

template<typename Fn, typename ...Args> 
void sort_tester(Fn sortfunc, Args... args) { 
    int bigArray[] {1,2,3,4,5,6}; 
    bool flag = false; 
    for (int i = 0; i < 6; i++) { 
     int n = flag ? 1000 : 100; 
     sortfunc(bigArray[i],n,args...); 
     flag = !flag; 
    } 
} 

void selectionSort(int elem, int n) { 
    std::cout << "selectionSort(" << elem << ',' << n << ")\n"; 
    // Do stuff ... 
} 

void mergeSort(int elem, int n, int extraParam) { 
    std::cout << "mergeSort(" << elem << ',' << n << ',' << extraParam << ")\n"; 
    // Do stuff ... 
} 

这可以如下使用:

int main() { 
    sort_tester(selectionSort); 

    sort_tester(mergeSort,42); 
} 

查看live example

+1

我可以推荐不使用'std :: function',而只是一个普通的模板参数吗?现在它需要'Args'完美匹配参数,不允许转换。如果用简单的模板参数替换'std :: function <...>',转换就会发生,并且可能会更轻。 –

+0

'std :: function'为你提供类型执行(根据你的用例可以是好的或坏的),但它也给你额外的间接和堆分配。 – caps

+0

@GuillaumeRacicot感谢您的建议。我现在使用普通模板参数而不是'std :: function'简化了我的代码示例。 – user0042

1

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

您可以通过函数来​​替换参数。

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 */ }); 
+0

据我所知,OP的问题是如何用不同数量的参数调用排序算法(函数)。这需要暗示可变参数包IMO。 – user0042

+0

@Guillaume Racicot你在参数点(:。但是user0042是正确的,该函数用于不同数量的参数。 –

+0

我喜欢在这里使用模板的模板,但是指向'char *'和一个指向'int *'的指针并不是非常干净的方式来传递数组引用... – caps

相关问题