2015-06-30 3 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

Почему вы называете 'новый' в первую очередь? У вас есть вся информация во время компиляции. – 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 dev).

После нескольких испытаний это показало, что это работает.

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