如何模板这种功能?

时间:2016-02-03 01:02:03

标签: 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 &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
}

我打算专门研究n = 3直接调用cmp2,剩下的就是cmp&lt; n - 1>但后来我意识到每次分割时我都必须创建一个新的数据数组和迭代器数组,这会严重影响性能。

在我的情况下,n是可变的并且可以达到~10,有没有办法对它进行模板化以便它可以像我手动编写并将函数指针收集到数组一样快速运行?

1 个答案:

答案 0 :(得分:0)

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

print 的示例(仅限字符串):

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

你将解包2x指针+索引,进行比较并进一步传递第二个和剩余的参数,直到你到达cmp2的尾部。