2015-12-15 48 views
1

考慮下面的代碼:比較參數包?擴展語法?

#include <utility> 

class foo 
{ 
private: 
    struct s 
    { 
     int value; 
     s* p2; 
    } *p; 
public: 
    foo() : p(new s{ 0, nullptr }) {} 

    template<class... Args> 
    void fun(Args&&... val) 
    { 
     if (val > p->value) //point of interest 
      p->p2 = new s{ { std::forward<Args>(val)... }, nullptr }; 
    } 
}; 

int main() 
{ 
    foo o; 
    o.fun(34); 
} 

我怎麼會得到val > p->value工作?我嘗試了val... > p->value{ val... } > p->value之類的東西,但我似乎無法得到正確的語法。謝謝!

+0

那是什麼做的(即,你要什麼條件實際上是)? –

+1

也許你正在尋找一個更大的價值條件,或者任何價值更大?即相當於C++ 17'((val> p-> value)&& ...)'或'((val> p-> value)|| ...)'但是,你不能轉向一個參數包裝進'new s {{val1,new s {{val2,new s {{val3,...}}}}}}''如果這就是您要做的。 – chris

+0

有一點需要考慮的是,從相同類型的參數包中構建'std :: list'很容易。 'std :: list {std :: forward (vals)...}'。這是因爲它有一個列表構造函數,通過該初始化列表的常規迭代初始化列表。也許你也可以這樣做。 – chris

回答

1

我將如何獲得val > p->value工作?

一種選擇是使用一個更簡單的功能:

void fun(int val) 
{ 
    if (val > p->value) 
     p->p2 = new s{ val, nullptr }; 
} 
+0

其實很好。這個初始化器總是不成形,除非'val'有一個或沒有元素。 –

+0

@ T.C。,你是在談論'new s {...}的初始化程序;'? –

+0

我正在談論OP代碼中的{std :: forward (val)...}部分。 –