基于函数指针参数拆分多个可变参数模板包

时间:2017-02-08 20:01:39

标签: c++ templates variadic-templates variadic-functions

我正在尝试创建一些基于模板的函数来打包函数指针和一些输入参数,然后调用它并将一些输出值存储在其他地方。作为开始,我正在尝试创建一个函数,其中一个可变参数模板用于输入参数,另一个用于返回值。这就是我提出的,但它不起作用:

template<typename... Args, typename... Ret>
void Call(void (*func)(Args..., Ret...), Args&&... args)
{

}

void Foo(float x, int& y)
{
    y = int(x * x);
}

int main(int argc, const char* argv[])
{
    Call(&Foo, 2.f);
    return 1;
}

ideon给出了以下错误:

prog.cpp: In function 'int main(int, const char**)':
prog.cpp:16:16: error: invalid conversion from 'void (*)(float, int&)' to 'void (*)(float, float, int&)' [-fpermissive]
  Call(&Foo, 2.f);
                ^
prog.cpp:4:6: note:   initializing argument 1 of 'void Call(void (*)(Args ..., Ret ...), Args&& ...) [with Args = {float}; Ret = {float, int&}]'
 void Call(void (*func)(Args..., Ret...), Args&&... args)
      ^

为什么Ret推断为{float, int&}?函数指针参数显然用于演绎,但似乎没有使用Args...

1 个答案:

答案 0 :(得分:1)

您可以添加图层来修复某些模板参数:

template <typename ... Ts>
struct helper
{
    template <typename ...Ret, typename ... Us>
    static void Call(void (*func)(Ts..., Ret...), Us&&... args)
    {

    }

};


template<typename F, typename... Args>
void Call(F&& f, Args&&... args)
{
    helper<Args...>::Call(std::forward<F>(f), std::forward<Args>(args)...);
}

Demo

相关问题