簡體   English   中英

C ++可變參數函數:使用參數數量作為模板參數

[英]C++ variadic function: use number of parameters as template argument

我有一個可變坐標數L的向量類template <unsigned int L> class Vec

我想實現glsl的字段選擇功能,該功能允許您通過選擇vec4 a=vec4(1,2,3,4); vec4 b=a.xyxz; //b is (1,2,1,3).來創建新矢量vec4 a=vec4(1,2,3,4); vec4 b=a.xyxz; //b is (1,2,1,3). 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);

解:

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]

像這樣:

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

它也可以使用舊式的函數簽名語法(在這種情況下,我只是更喜歡尾隨返回類型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM