Прошло много времени в разработке на 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
Вы можете превратить ваш конструктор в вариационный шаблон:
//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
@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);
}
}