如何在C ++中推导出函数参数类型?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中推导出函数参数类型?相关的知识,希望对你有一定的参考价值。

有功能定义:

void f(int) { }

我想定义:

int a;

但如果函数定义更改为:

void f(double) { }

变量定义必须变为:

double a;

也就是说,“a”的类型必须与“f”函数的第一个参数相同。我需要以下内容:

decltype_of_argument<f, 0> a;

在C ++中有可能吗?

答案

您可以通过模板元编程获取类型:

template <class F> struct ArgType;

template <class R, class T> 
struct ArgType<R(*)(T)> {
  typedef T type;
}; 

void f(int) {}

#include <type_traits>
#include <iostream>

int main() {

  // To prove
  std::cout << std::is_same< ArgType<decltype(&f)>::type, int >::value << '
';

  // To use
  ArgType<decltype(&f)>::type a;
}

根据您想要使用它的位置,您需要将此litte模板专门用于其他可调用实体,例如成员函数poitners,具有更多参数的函数,仿函数等。在Boost库中有更多复杂的方法,例如, https://stackoverflow.com/a/15645459/1838266

警告:只有当函数/ callable的名称明确映射到一个函数签名时,所有这些实用程序才有效。如果一个函数被重载或者一个函子有一个以上的operator(),那么必须通过显式地转换到正确的签名来选择正确的函数/运算符,这使得通过模板找到部分签名非常无用。这也以某种方式应用于模板,虽然获得明确的专业化可调用的签名可能仍然有用,例如:

template <unsigned N, class F> struct ArgType; //somewhat more sophisitcated 

template <class T> void f(int, T);

ArgType<0, decltype(&f<double>)> //int    - ArgType has it's use here
ArgType<1, decltype(&f<double>)> //double - here it's useless...
另一答案

使用模板?

template< typename T >
void f( T )
{
  T a;
}
另一答案

这取决于你想做什么,应该使用哪个变量。如果它在函数中,模板可能是一个不错的选择:

template<typename T>
void foo(T ) {
    T a;
}

或者,如果你不在函数之内并且要求真正知道这个你可以使用Boost.TypeTraits,即function_traits<void (int)>::arg1_type将给int

另一答案

其中一种方法是使用typedef作为函数参数的类型。例如

typedef int TParm;

void f( TParm );

TParm a;

您可以选择该类型的任何名称。例如parm_t等。重要的是不会发生名称冲突。

在这种情况下,如果要更改参数的类型,则只需要更改typedef。

或者,如果您的编译器支持别名,您也可以编写

using TParm = int;

void f( TParm );

TParm a;

您还可以将函数包装在命名空间或类中。:)例如

struct IFunction
{
   typedef int parm_t;
   static void f( parm_t = parm_t() ) {}
};

//...

IFunction::parm_t a;
IFunction::f( a );
另一答案

如何使模板功能?

template <typename T>
void f(T t);

以上是关于如何在C ++中推导出函数参数类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Router v5 中推送到历史记录?

如何在 React Router v5 中推送到历史记录?

如何在 Angular 4 中推送到数组的 Observable? RxJS

如何在GCP发布/订阅中推送到多个端点?

如何在javascript中维护父变量值[重复]

TableView 在 Swift 中推送到详细视图