我正在使用某个具有某个CallMethod
函数的C API(它是Python API,但它应该是无关紧要的)。如下所示:
void * C_API_CallMethod(void *h1, void *h2, ...);
我想将它封装到一个带有一些奇特类型的C ++库中。特别是,我的所有对象都是具有特定方法FancyHandler
的{{1}}个对象。
类似的东西:
getPointer
我正在研究可变参数模板,但这并不是我想要的。或者看起来有点过于复杂,因为类型是已知的,参数的数量不是。变体似乎更普遍,我不知道如何限制这些事情。
使用//template<>?
FancyHandler CallMethod(const FancyHandler &first, const FancyHandler &second,
const FancyHandler& ...list) {
return C_API_CallMethod(first.getPointer(), second.getPointer(),
(...).getPointer(), nullptr);
}
似乎向后退了一步,我希望避免这种情况......此外,我很久没有使用过它而且不想再重新开始。我更喜欢更多的C ++解决方案。
此时,我无法编译源代码,因为编译器抱怨省略号,因为很明显,它不是有效源。
我该如何解决这个问题?
答案 0 :(得分:0)
使用可变参数模板,您可以尝试以下方法(包装getPointer):
void * C_API_CallMethod(void *h1, void *h2, ...);
struct FancyHandler
{
void* getPointer() const { return nullptr; }
};
void* getPointer(const FancyHandler&first) {
return first.getPointer();
}
template<typename... Args>
void pass(Args&&... args) {
C_API_CallMethod(args...);
}
template<typename... Args>
void CallMethod(const FancyHandler& h1, const FancyHandler& h2, Args&&... args) {
pass(getPointer(h1), getPointer(h2), getPointer(args)...);
}