gpt4 book ai didi

c++ - 根据函数指针参数拆分多个可变参数模板包

转载 作者:行者123 更新时间:2023-11-28 05:18:23 28 4
gpt4 key购买 nike

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

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...

最佳答案

您可以添加一个层来修复一些模板参数:

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

关于c++ - 根据函数指针参数拆分多个可变参数模板包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42122550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com