Wan*_*ang 1 c++ function-pointers variadic-templates template-argument-deduction c++17
说我有函数指针R(*fp)(...A)。有什么方法可以获取类型R和类型列表A...吗?std::invoke_result_t似乎不起作用。而且我找不到参数列表的任何内容。
#include <iostream>
#include <cstdlib>
#include <type_traits>
typedef int(*fp_t)(int, float);
std::invoke_result_t<fp_t> x = 10;
int main()
{
std::cout << "Hello, Wandbox!" << std::endl;
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
用c ++ 17编译会出现错误:
/opt/wandbox/gcc-head/include/c++/10.0.0/type_traits: In substitution of 'template<class _Fn, class ... _Args> using invoke_result_t = typename std::invoke_result::type [with _Fn = int (*)(int, float); _Args = {}]':
prog.cc:6:26: required from here
/opt/wandbox/gcc-head/include/c++/10.0.0/type_traits:2917:11: error: no type named 'type' in 'struct std::invoke_result<int (*)(int, float)>'
2917 | using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
Run Code Online (Sandbox Code Playgroud)
用模板元函数推导它们:
#include <tuple>
typedef int(*fp_t)(int, float);
template <class T>
struct function_signature{};
template <class Return, class... Args>
struct function_signature<Return(*)(Args...)> {
using return_type = Return;
using args = std::tuple<Args...>;
};
int main()
{
using ret = function_signature<fp_t>::return_type;
using args = function_signature<fp_t>::args;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |