C ++中的包装函数,具有任意数量的参数

时间:2014-11-27 18:00:25

标签: c++

我正在使用某个具有某个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 ++解决方案。

此时,我无法编译源代码,因为编译器抱怨省略号,因为很明显,它不是有效源。

我该如何解决这个问题?

1 个答案:

答案 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)...);
}