我正在尝试围绕使用不透明数据类型的旧C-API创建C++便捷包装器.有一个特定的C函数,它使用格式字符串,以及使用C <stdarg.h>工具的可变数量的参数.作为我的包装器的一部分,我希望能够将任意数量的参数(包括C++对象)传递给此函数.但是,由于<stdarg.h>设施显然无法处理非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...);
}
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为递归函数调用永远不会实际解包Args...,所以它只是递归直到堆栈溢出.我无法弄清楚如何解压缩参数,同时将当前参数传递给Convert函数,然后递归传递结果.
反正有没有这样做?
这可能是一个无用的问题,但它在我的脑海里停留了几个小时.
我想编写一个接受一些(POD)参数的函数,将它们转换为字符串并返回串联.例如
template<typename A, typename B>
string ToString(A a, B b)
{
stringstream ss;
ss << a << b;
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
很简单,对吧?但是当我想用未知数量的参数编写相同的函数时,它(当然对我来说)变得相当困难.
它甚至可能吗?任何解决方案