确定未定义函数的参数类型
Determining the Parameter Types of an Undefined Function
我最近了解到我不能:
- Take the address of a templatized function with a type it would fail to compile for
但我最近也了解到我 可以
所以一个未定义的函数:
int foo(char, short);
我想知道是否有一种方法可以将参数类型与 tuple
中的类型相匹配。这显然是一个元编程问题。在这个例子中,我真正想要的是 decltypeargs
:
enable_if_t<is_same_v<tuple<char, short>, decltypeargs<foo>>, int> bar;
任何人都可以帮助我了解如何制作 decltypeargs
吗?
对于非重载函数、指向函数的指针和指向成员函数的指针,只需执行 decltype(function)
即可为您提供未计算上下文中的函数类型,并且该类型包含所有参数。
因此,要将参数类型作为元组获取,您所需要的只是大量专业化:
// primary for function objects
template <class T>
struct function_args
: function_args<decltype(&T::operator()>
{ };
// normal function
template <class R, class... Args>
struct function_args<R(Args...)> {
using type = std::tuple<Args...>;
};
// pointer to non-cv-qualified, non-ref-qualified, non-variadic member function
template <class R, class C, class... Args>
struct function_args<R (C::*)(Args...)>
: function_args<R(Args...)>
{ };
// + a few dozen more in C++14
// + a few dozen more on top of that with noexcept being part of the type system in C++17
有了那个:
template <class T>
using decltypeargs = typename function_args<T>::type;
这需要你写decltypeargs<decltype(foo)>
。
在 C++17 中,我们将有 template <auto>
,所以上面可以是:
template <auto F>
using decltypeargs = typename function_args<decltype(F)>::type;
你会得到 decltypeargs<foo>
语法。
我最近了解到我不能:
- Take the address of a templatized function with a type it would fail to compile for
但我最近也了解到我 可以
所以一个未定义的函数:
int foo(char, short);
我想知道是否有一种方法可以将参数类型与 tuple
中的类型相匹配。这显然是一个元编程问题。在这个例子中,我真正想要的是 decltypeargs
:
enable_if_t<is_same_v<tuple<char, short>, decltypeargs<foo>>, int> bar;
任何人都可以帮助我了解如何制作 decltypeargs
吗?
对于非重载函数、指向函数的指针和指向成员函数的指针,只需执行 decltype(function)
即可为您提供未计算上下文中的函数类型,并且该类型包含所有参数。
因此,要将参数类型作为元组获取,您所需要的只是大量专业化:
// primary for function objects
template <class T>
struct function_args
: function_args<decltype(&T::operator()>
{ };
// normal function
template <class R, class... Args>
struct function_args<R(Args...)> {
using type = std::tuple<Args...>;
};
// pointer to non-cv-qualified, non-ref-qualified, non-variadic member function
template <class R, class C, class... Args>
struct function_args<R (C::*)(Args...)>
: function_args<R(Args...)>
{ };
// + a few dozen more in C++14
// + a few dozen more on top of that with noexcept being part of the type system in C++17
有了那个:
template <class T>
using decltypeargs = typename function_args<T>::type;
这需要你写decltypeargs<decltype(foo)>
。
在 C++17 中,我们将有 template <auto>
,所以上面可以是:
template <auto F>
using decltypeargs = typename function_args<decltype(F)>::type;
你会得到 decltypeargs<foo>
语法。