Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对这种函数进行模板化?_C++_Templates - Fatal编程技术网

C++ 如何对这种函数进行模板化?

C++ 如何对这种函数进行模板化?,c++,templates,C++,Templates,这是排序算法的一部分,我是这样开始的 inline void cmp2(float* a, float* b, int ia, int ib, int &ra, int &rb) { if (a[ia] > b[ib]) ra++; else rb++; } inline void cmp3(float* a, float* b, float* c, int ia, int ib, int ic, int &ra, int &rb, int

这是排序算法的一部分,我是这样开始的

inline void cmp2(float* a, float* b, int ia, int ib, int &ra, int &rb) {
    if (a[ia] > b[ib]) ra++;
    else rb++;
}
inline void cmp3(float* a, float* b, float* c, int ia, int ib, int ic, int &ra, int &rb, int &rc) {
    if (a[ia] > b[ib]) cmp2(a, c, ia, ic, ra, rc);
    else cmp2(b, c, ib, ic, rb, rc);
}
inline void cmp4(float* a, float* b, float* c, float* d, int ia, int ib, int ic, int id, int &ra, int &rb, int &rc, int &rd) {
    if (a[ia] > b[ib]) cmp3(a, c, d, ia, ic, id, ra, rc, rd);
    else cmp3(b, c, d, ib, ic, id, rb, rc, rd);
}
然后我想,“但是,嘿,我完全可以作为一个递归模板函数来做这件事。”。我重新开始

inline void cmp2(float* a, float* b, int ia, int ib, int &ra, int &rb) {
    if (a[ia] > b[ib]) ra++;
    else rb++;
}

template <int n>
inline void cmp(float** data, int* i, int* r) {
    if (data[0][i[0]] > data[1][i[1]]) cmp<n - 1>( ??? brain crash
}
内联无效cmp2(浮点*a、浮点*b、整数ia、整数ib、整数ra、整数rb){
如果(a[ia]>b[ib])ra++;
else-rb++;
}
模板
内嵌无效cmp(浮点**数据,int*i,int*r){
如果(数据[0][i[0]]>数据[1][i[1]])cmp(?脑崩溃
}
我打算专门化n=3来直接调用cmp2,其余的调用cmp,但后来我意识到每次拆分时都必须创建一个新的数据数组和迭代器数组,这会严重影响性能


在我的例子中,n是可变的,可以增加到~10,有没有一种方法可以对其进行模板化,使其运行的速度与我手工写出并将函数指针收集到数组中的速度一样快?

您可以使用可变模板(需要C++11)

打印示例(仅限字符串):

#包括
无效打印(常量std::string&s)
{

std::这不是比你正在做的要简单得多吗?看起来你只是在寻找最大值的“索引”(a=1,b=2,…),并增加相应的变量(
ra
rb
,…)好吧,是的,我猜这是个坏例子,这不是实际的算法。我试图把它简化为我能想到的最简单的事情,同时为了这个目的保留了这个问题。当你想在头部或尾部提取一些参数时,通过变量模板进行后递归是很有用的,并且每次递归都应该发生相同的逻辑e步骤。看起来您的代码对包中的一些非连续参数序列执行条件参数传递,所以我不确定可变模板是否是最好的方法。如果可能的话,它将无法读取,并且可能需要比您编写的代码多得多的代码。您介意演示如何执行吗应用可变模板来修改OP的函数,而不是仅仅提到语言特征的存在?
#include <iostream>

void print(const std::string& s)
{
    std::cout << s << std::endl;
}

template<typename... Args>
void print(const std::string& s, Args... args)
{
    std::cout << s;
    print(args...);
}

int main()
{
    print("a", "c", "b");
    return 0;
}