2015-02-03 9 views
1

Я немного искал несколько вариационных шаблонов, и я нашел то, что хотел бы сделать, но я не знаю, возможно ли это или нет.Variadic Typenames in Template Functions

Грубое представление о том, что я пытаюсь выполнить, - это класс шаблонов, который выполняет определенные операции в зависимости от того, какой тип объекта хранится в нем. Я хотел бы иметь возможность обрабатывать наследование, поэтому класс типа «Производный» будет включен в операцию, которая имеет дело только с базовым объектом. Я понял, что вариационные шаблоны - это то, что мне нужно, я просто не могу заставить их работать, как я хочу.

В принципе, я хотел бы знать, можете ли вы сделать вариационную функцию, которая принимает переменное число имен типов вместо переменного количества аргументов.

Вот то, что я до сих пор:

template <typename T> 
void DoesNotWork() 
{ 
    //Do stuff 
} 

template <typename T, typename ...Args> 
void DoesNotWork() 
{ 
    //Do stuff 

    DoesNotWork<Args...>(); 
} 

Однако, поскольку обе функции имеют одинаковое число аргументов, он выдает ошибку «неоднозначной функции ссылочный». Если я удаляю верхнюю функцию, последний рекурсивный вызов пытается вызвать «DoNotWork <>()», который не имеет определения.

Как бы я это сделал? Или это невозможно?

ответ

3

Невозможно устранить двусмысленность между двумя функциями, когда Args пуст.

Что вам нужно:

template <typename T> 
void DoesNotWork() 
{ 
    //Do stuff 
} 

template <typename T1, typename T2, typename ...Args> 
void DoesNotWork() 
{ 
    //Do stuff 

    DoesNotWork<T2, Args...>(); 
} 
+0

Спасибо! Это именно то, что мне нужно. – JubileeTheBear

+0

@JubileeTheBear, рад, что смогу помочь. –