2014-08-31 3 views
2

У меня есть векторный класс template <unsigned int L> class Vec счетчика переменных координат L.C++ variadic function: использовать количество параметров в качестве аргумента шаблона

Я хотел бы реализовать функцию выбора полей из GLSL, которая позволяет создавать новые векторы, выбрав как vec4 a=vec4(1,2,3,4); vec4 b=a.xyxz; //b is (1,2,1,3).

В моей программе я хотел бы создать что-то вроде этого:

Vec<3> a={7,8,9}; 
Vec<4> b=a.select(0,2,2,1); //each argument is an index of the coordinate to use. 
Vec<5> c=b.select(0,1,2,3,1); 

Solution :

template<typename... Args,unsigned int S=sizeof...(Args)> Vec<S> select(Args&&... args){ 
    Vec<S> result; 
    int indices[S]={args...}; 
    for(int i=0;i<S;i++){ 
     result[i]=this->v[indices[i]]; //v is the float array that stores the values. 
    } 
    return result; 
} 

и некоторые нелепые примеры, чтобы увидеть, если он работает:

Vec<3> a={7,8,9}; 
Vec<9> b=a.select(0,0,1,1,0,0,1,1,2); 
Vec<1> c=a.select(2); 

a=[7,8,9] 
b=[7,7,8,8,7,7,8,8,9] 
c=[9] 
+0

Возможный дубликат [этот вопрос] (http://stackoverflow.com/questions/12024304/c11-number-of-variadic-template-function-parameters) – Edward

+2

'template class Vec' remove 'const', он избыточен –

ответ

3

Как это:

template<int N> 
class Vec {}; 

template<typename... Args> 
auto foo(Args&&...) -> Vec<sizeof...(Args)>; 

int main() 
{ 
    auto v = foo(1,2,3); 
    Vec<1> vv = foo(5); 
} 

Он работает с синтаксисом функции подписи старого стиля, тоже (я предпочитаю отставая тип возвращаемого значения в данном конкретном случае).

+0

спасибо, ваш подход очень хорош. Я реализовал его таким образом. см. выше для кода. – tly