C++14环境下std::invoke_result_t的正确等价替换方法
错误原因
std::result_of_t与C++17的std::invoke_result_t语法规则存在本质差异:
std::invoke_result_t<Callable, ArgTypes...>接收的模板参数依次为可调用类型、各参数的类型std::result_of_t<Callable(ArgTypes...)>接收的模板参数是一个函数类型签名,格式为「可调用类型(参数类型1, 参数类型2, ...)」
你之前的改写仅传入了可调用类型Fin,未按规则拼接参数列表组成合法的函数签名,编译器无法匹配到正确的模板偏特化实现,因此抛出不完整类型的编译错误。
正确改写方案
将对应代码替换为以下C++14兼容实现即可:
using X = typename std::result_of_t<Fin(size_t)>::first_type; using Y = typename std::result_of_t<Fin(size_t)>::second_type;
补充说明
- 该写法兼容你代码中出现的C++14泛型lambda(即报错信息中提到的带
auto形参的lambda),无需额外修改lambda相关逻辑 - 若替换后提示
std::result_of_t未定义,请确认代码已包含<type_traits>头文件,且Vitis工程的编译标准选项已配置为C++14(添加编译选项-std=c++14) - 后续其余
std::invoke_result_t的替换均可遵循统一规则:std::invoke_result_t<F, A1, A2, ... An>等价转换为std::result_of_t<F(A1, A2, ... An)>,注意不要遗漏包裹参数列表的括号。
内容的提问来源于stack exchange,提问作者weirdEd
相关产品推荐
相关产品推荐

