2015-06-30 65 views
0

長時間在C++中開發,所以請忍受我對語言的無知.. 在我的設計中,我有派生類,爲此使用模板傳遞基類。基於模板的派生類和可變參數的C++構造函數

template <class DeviceType, class SwitchType> class Controller : public SwitchType 
{ 
public: 
/* Constructor */ 
Controller(byte ID, byte NumberOfDevices, int size, int data[]) : SwitchType(size, data) 
    { 
    } 
}; 

我使用這個如下:

Controller <ValueDriven, Eth_Driver> ctn(1, 2, 3, new int[3]{2, 3, 8}); 

是否有可能在這裏使用省略號?從而使最終的結果會喜歡這個..

Controller<ValueDriven, Eth_Driver> ctn(1, 2, 3, 2, 3, 8); 

我試過橢圓,但不可能找到一種方法,從控制器通過橢圓SwitchType。

注*將此用於arduino平臺。因此,從性病避而遠:: lib中

+1

我覺得被泄露的地方一些內存... – ikh

+0

有泄漏,如果數據沒有被刪除的存在。 – RB1987

+0

你爲什麼在第一時間打電話給'new'?你可以在編譯時獲得所有信息。 – JorenHeit

回答

5

你可以讓你的構造爲variadic template

//take any number of args 
template <typename... Args> 
Controller(byte ID, byte NumberOfDevices, int size, Args&&... data) 
    : SwitchType(size,std::forward<Args>(data)...) 
{ 
} 

現在你可以這樣調用構造函數:

Controller<ValueDriven, Eth_Driver> ctn(1, 2, 3, 2, 3, 8); 
//           ^size 
//            ^^^^^^^ forwarded 
+0

不錯,儘管你會遇到將這些值存儲在某個地方的問題,並且他可能必須不使用'std :: forward',或者自己實現它。 – JorenHeit

0

@TartanLlama以上沒有工作對於我在Visual Studio 13(C++或Arduino開發環境)中。

經過一些試驗發現這個工作。

class test1 
{ 
public: 
    test1(int argc, ...) 
    { 

     printf("Size: %d\n", argc); 
     va_list list; 
     va_start(list, argc); 
     for (int i = 0; i < argc; i++) 
     { 
      printf("Values: %d \n", va_arg(list, int)); 
     } 
     va_end(list); 
    } 
}; 

class test2 : public test1 
{ 
public: 

    template<typename... Values> test2(int val, int argc, Values... data) : test1(argc, data...) 
    { 
     printf("\n\nSize @Derived: %d\n", argc); 
     va_list args; 
     va_start(args, argc); 
     for (int i = 0; i < argc; i++) 
     { 
      printf("Values @Derived: %d\n", va_arg(args, int)); 
     } 
     va_end(args); 
    } 
}; 

void setup() 
{ 

    test2(2090, 3, 30, 40, 50); 
} 

void loop() 
{ 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    setup(); 
    while (1) 
    { 
     loop(); 
     Sleep(100); 
    } 
} 
相關問題