наследование — C ++ Конструкторы производного класса на основе шаблонов & amp; переменные аргументы

Прошло много времени в разработке на 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. Так что держитесь подальше от std :: lib

0

Решение

Вы можете превратить ваш конструктор в вариационный шаблон:

//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
5

Другие решения

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

По вопросам рекламы [email protected]