c++ - How to template this kind of function? -
its part of sorting algorithm, started out this
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); }
and thought "but hey, totally recursive template function". started over
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 }
i going specialize n = 3 call cmp2 directly , rest go cmp< n - 1 > realized have create new array of data , iterator arrays every time splits hurt performance.
in case n variable , can go ~10, there way template run quick if write out hand , gather funcion pointers array?
you use variadic templates (c++11 required).
an example print (strings only):
#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; }
you unpack 2x pointer+index, comparison , pass second , remaining arguments further until reach tail cmp2.
Comments
Post a Comment