function traits

原创 2007年09月29日 10:42:00
我写的一个简单的 function traits,功能比 boost::unary_traits 和 boost::binary_traits 强,下面是其实现和一个简单的demo。这个function traits已经被我用在了一个C++ delegate 上,不过做了一些修改,但事实证明这个function_traits很有用。

template <typename Operation>
struct function_traits;

// no argument

// function type
template <typename R>
struct function_traits<R ()>
{
    // this is function type, not function pointer type
    typedef R (function_type)();
    typedef R result_type;
    enum{argument_count = 0};
    enum{ismemfun = false};
};

// function pointer type
template <typename R>
struct function_traits<R (*)()>
{
    typedef R (function_type)();
    typedef R result_type;
    enum{argument_count = 0};
    enum{ismemfun = false};
};

// pointer to member function
template <typename C, typename R>
struct function_traits<R (C::*)()>
{
    typedef C class_type;
    typedef R result_type;
    enum{argument_count = 0};
    enum{ismemfun = true};
};

// one argument
template <typename R, typename A>
struct function_traits<R (A)>
{
    typedef R (function_type)(A);
    typedef R result_type;
    enum{argument_count = 1};
    typedef A first_argument_type;
};

template <typename R, typename A>
struct function_traits<R (*)(A)>
{
    typedef R (function_type)(A);
    typedef R result_type;
    enum{argument_count = 1};
    typedef A first_argument_type;
};

template <typename C, typename R, typename A>
struct function_traits<R (C::*)(A)>
{
    typedef C class_type;
    typedef R result_type;
    enum{argument_count = 1};
    enum{ismemfun = true};
    typedef A first_argument_type;
};

// two arguments
template <typename R, typename A, typename B>
struct function_traits<R (A, B)>
{
    typedef R (function_type)(A);
    typedef R result_type;
    enum{argument_count = 2};
    typedef A first_argument_type;
    typedef B second_argument_type;
};

template <typename R, typename A, typename B>
struct function_traits<R (*)(A, B)>
{
    typedef R (function_type)(A);
    typedef R result_type;
    enum{argument_count = 2};
    typedef A first_argument_type;
    typedef B second_argument_type;
};

template <typename C, typename R, typename A, typename B>
struct function_traits<R (C::*)(A, B)>
{
    typedef C class_type;
    typedef R result_type;
    enum{argument_count = 2};
    enum{ismemfun = true};
    typedef A first_argument_type;
    typedef B second_argument_type;
};

//-----------------------------------------------------------

typedef int (*FUNC0)();
typedef int (*FUNC1)(int);
typedef int (*FUNC2)(int, char);

class AClass{
public:
    void speak0();
    int speak1(int);
    int speak2(int, char);

    typedef void (*tspeak0)();
    typedef int (*tspeak1)(int);
    typedef int (*tspeak2)(int, char);
};

#include <iostream>
#include <typeinfo>

int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;
    cout << typeid(function_traits<int (char)>::result_type).name() << '/n';
    cout << typeid(function_traits<int (*)(char)>::result_type).name() << '/n';
    cout << typeid(function_traits<int (AClass::*)(int)>::class_type).name() << '/n';

    //    cout << typeid(function_traits<FUNC2>::first_argument_type).name() << '/n';
//    cout << typeid(function_traits<FUNC2>::second_argument_type).name() << '/n';

//    cout << typeid(function_traits<int (int ***)>::first_argument_type).name() << '/n';
    return 0;
}
 

c++11之function_traits

function_traits 例:int func(int a,string b); function_traits::function_type; //获取函数类型 int _cdecl(int,...
  • luoqie123
  • luoqie123
  • 2016年07月28日 19:56
  • 542

增强boost中function_traits的能力

boost的type_traits功能相当强大,特别是function_traits,能够辅助做很多事情。但是美中不足,function_traits竟然没有针对成员函数做任何的traits提取,似乎...
  • Realdodo
  • Realdodo
  • 2006年09月09日 23:31
  • 1877

续:增强boost中function_traits的能力

上一篇说过,在function_traits里面加入成员函数类型traits的工作纯粹是体力活,那么原作者没有理由“忽略”这个方面——毕竟他已经做了绝大多数的体力活,这个type_traits库就是大...
  • Realdodo
  • Realdodo
  • 2006年09月12日 01:30
  • 1293

boost::call_traits

 写C++ template程序的时候,经常遇见的问题之一就是,如何让一个函数同时支持pass by value和pass by reference,例如:class Primitive...{pub...
  • whererush
  • whererush
  • 2006年10月12日 00:59
  • 2538

function_traits

template struct function_traits { private: using call_type = function_traits ; public: usin...
  • lishaoyu
  • lishaoyu
  • 2015年11月28日 13:32
  • 600

我对C++ Traits编程技法的一点点理解

第一次听说traits是在一次电话面试中,当时还没有听说过这个词。之后查过资料,但也不是十分明白,直到今天重新看了一下《STL源码剖析》,稍微有一些想法。 1. traits是模板编程里面的一个编程...
  • erorr
  • erorr
  • 2014年04月13日 01:37
  • 1467

Boost::Call_Traits 介绍

先谈谈什么是Traits,BS的解释如下: Think of a trait as a small object whose main purpose is to carry information ...
  • ad33k
  • ad33k
  • 2011年07月06日 11:23
  • 973

Boost库中的Traits(is_float, is_class)

对以判断是不是某个基本类型(整数, 浮点, bool)可以参考下面代码: 3. is_float [cpp] view plaincopy t...
  • lishaoyu
  • lishaoyu
  • 2015年07月23日 14:03
  • 336

C++traits技术的理解

traits是c++中的自动类型推断,可以用来获得一个类型的相关信息。比如我们有一个泛型的迭代器类,其中T为所指向的类型。 template class myIterator { ... };当我...
  • qq100440110
  • qq100440110
  • 2016年07月07日 22:17
  • 749

《STL源码剖析》学习之traits编程

在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通...
  • shudou
  • shudou
  • 2013年09月15日 20:04
  • 8311
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:function traits
举报原因:
原因补充:

(最多只允许输入30个字)