Я пытаюсь создать удобную оболочку 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
, а затем рекурсивно передает результат.
Есть ли способ сделать это?