Распаковка списка аргументов с переменным шаблоном

Я пытаюсь создать удобную оболочку C ++ вокруг старого C-API, который использует непрозрачный тип данных. Есть одна конкретная C-функция, которая принимает строку формата вместе с переменным количеством аргументов, используя средства C . Как часть моей оболочки, я хочу иметь возможность передавать этой функции произвольное количество аргументов (включая объекты C ++). Однако, поскольку очевидно, что средства не могут работать с данными, не относящимися к POD, Я создал шаблонную функцию преобразования, которая преобразует объекты C ++ (например, std :: string ) в эквиваленты POD.

Я думал, что все это будет простым упражнением с использованием вариативных шаблонов C ++ 0x, но я Мне трудно понять, как написать эту функцию таким образом, чтобы должным образом разворачивать пакет аргументов при применении моей функции преобразования к каждому аргументу.

У меня пока что:

   template <class T, class... Args>
   void apply(OPAQUE* object, const char* fmt_string, T&& val, Args&&... args)
   {
      apply(object, fmt_string, Convert(val), args...);
   }

   template <class... Args>
   void apply(OPAQUE* object, const char* fmt_string, Args&&... args)
   {
      C_API_Function_Call(object, fmt_string, args...);
   }

Конечно, это не работает потому что рекурсивный вызов функции никогда не распаковывает Args ... , поэтому он просто повторяется до тех пор, пока стек не переполнится. Я не могу понять, как заставить его распаковать аргументы, пока также передает текущий аргумент функции Convert , а затем рекурсивно передает результат.

Есть ли способ сделать это?

5
задан Channel72 7 February 2011 в 21:28
поделиться