前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++11模板:获取函数的参数类型

c++11模板:获取函数的参数类型

作者头像
10km
发布2019-05-25 20:34:31
4.1K0
发布2019-05-25 20:34:31
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433437

假设我们已经知道一个函数类型的定义double(unsigned char*, unsigned char*),如何获取这个函数定义中的输入和输出参数类型呢?

c++11提供的模板函数std::functionstd::tuple_element可以将一个函数定义的输入和输出参数类型一个一个解析出来,下面是实现代码

代码语言:javascript
复制
#include <functional>
#include <tuple>

#include <windows.h>
#include "FSFaceSDK.h"
template<typename T> 
struct function_traits;  
// R为返回类型
// ...Args 为输入参数类型,个数不限
template<typename R, typename ...Args> 
struct function_traits<std::function<R(Args...)>>
{
    static const size_t nargs = sizeof...(Args);
	// 返回类型
    typedef R result_type;

	// 输入参数类型,i为从0开始的参数类型索引
    template <size_t i>
    struct arg
    {
        typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
    };
};
inline double compare(const face_code &f1,const face_code&f2){

	typedef std::function<double(unsigned char*, unsigned char*)> feacomp_fun;
	return (double)FSCompare(
		/* 强制类型转换为function_traits<feacomp_fun>::arg<0>::type,第一个输入参数类型 */
		(function_traits<feacomp_fun>::arg<0>::type)f1.element,	
		/* 强制类型转换为function_traits<feacomp_fun>::arg<1>::type,第一个输入参数类型 */
		(function_traits<feacomp_fun>::arg<1>::type)f2.element);
}

参考资料

https://stackoverflow.com/questions/9065081/how-do-i-get-the-argument-types-of-a-function-pointer-in-a-variadic-template-cla

https://en.cppreference.com/w/cpp/utility/functional/function

https://en.cppreference.com/w/cpp/utility/tuple/tuple_element

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档