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

Popular posts from this blog

Delphi XE2 Indy10 udp client-server interchange using SendBuffer-ReceiveBuffer -

Qt ActiveX WMI QAxBase::dynamicCallHelper: ItemIndex(int): No such property in -

python - cx_oracle unable to find Oracle Client -