函数参数中C++可变模板特化报错求助
解决MakeASXFunc模板特化的函数调用错误
嘿,你的问题根源一眼就能看出来——编译器报错是因为你在operator()里把std::tuple类型的m_args当成函数来调用了!
先看你出错的那行代码:
m_args(std::make_tuple(std::forward<Args>(args)...));
这里的m_args是std::tuple<Args...>类型的成员变量,它根本不是可调用对象,你却用函数调用的语法()去操作它,编译器当然会吐槽“项不会计算为接受1个参数的函数”。
你的意图应该是把传入的参数打包成tuple并存储到m_args里对吧?那正确的写法应该是赋值操作,而不是函数调用。下面是修正后的完整代码:
#include <tuple> #include <utility> // 用于std::forward template <typename T> struct MakeASXFunc; template <typename R, typename... Args> struct MakeASXFunc<R (Args...)> { std::tuple<Args...> m_args; void operator ()(Args&&... args) { // 把打包后的tuple赋值给m_args,而不是调用它 m_args = std::make_tuple(std::forward<Args>(args)...); // 如果想更高效地保存参数的左值/右值属性,可以用forward_as_tuple: // m_args = std::forward_as_tuple(std::forward<Args>(args)...); } };
这样修改后,你原来的使用代码:
MakeASXFunc<void (int, int)> f; f(54, 54);
就能正常编译运行了,它会把两个int参数打包成std::tuple<int, int>并存储到f.m_args里。
另外补充一点:如果你希望m_args能完美保留参数的左值/右值属性,使用std::forward_as_tuple会更合适,它会创建一个包含引用的tuple;而std::make_tuple会对参数做一次拷贝(除非参数本身是右值,会触发移动操作)。
内容的提问来源于stack exchange,提问作者AA.
相关产品推荐
相关产品推荐

