Я пытаюсь написать функцию, которая принимает переменное количество аргументов переменных типов. Типы всегда будут POD, за исключением одного случая, когда будет список POD. Я получил это с расширением пакета и рекурсивными вызовами функций шаблона.C++ function template specialization
Эта функция в настоящее время работает для всех переопределений POD с помощью специализации по шаблону, но я хочу создать специализированную специализацию для списка, но сохранить шаблон в шаблоне. Я понимаю, что это может быть невозможно, так как это фактически частичная специализация на уровне функции. Мне интересно об обходных решениях для такого сценария.
Вот что я делаю.
template<typename T, typename ...TArgs>
void Params2(T value, TArgs... args) {
Params2(value);
Params2(args...);
}
template<typename T>
inline void Params2(T c) { //invalid msg }
template <> inline void Params2<unsigned char>(unsigned char c) { //do something with char }
template <> inline void Params2<char>(char c) { //do something with uchar }
template <> inline void Params2<unsigned short>(unsigned short c) { //do something with short }
template <> inline void Params2<short>(short c) { //do something with ushort }
// more POD overrides
Если я делаю следующее, это работает, потому что я полностью определен тип списка:
template <>
inline void Params2< libfc::List<int> >(libfc::List<int> l)
{
for (auto itt = l.Begin(); itt != l.End(); ++itt)
{
//do something with each int
}
}
, что я хочу быть в состоянии сделать это:
template <>
template <typename R>
inline void Params2<libfc::List<R> >(libfc::List<R>) {
//do something with for each element of type R
}
Я бы предпочел не делать переопределение для каждого типа списка, который может выполнять функция, но я могу согласиться с тем, что если нет лучшего варианта.
редактировать: Вызывающее приложение будет вызывать эту функцию вдоль линий (не действительный код, просто пример):
Params2(10, 25, "test", List<int> { 5, 10 }, List<double> { 3.14, 9.81 });