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;
}
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

评论中过滤“非文明”词语

//常见的过滤“非文明”字符 public class Check_Word    {        public string CheckFalseWord(string sIn)...

用filter解决汉字编码及禁止页面缓存 和 用listener实现在线人数统计

import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public cl...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

一个工科研究生毕业后的职业规划

我今年39岁了,25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训。现在开一个小公司,赚的钱刚够养家糊口的。看看这些刚毕业的学生,对前景也很迷茫,想抛砖引玉,谈谈自己的看法...

三段式状态机的第一个输出状态

设计状态机时需要明确状态机各个状态是如何跳转的,要知道状态机是从哪一个状态开始输出的。       常用的三段式状态机设计一般采用三个alway语句:       1.第一个always语句描述时序逻...

boost function_traits

Expression Result function_traitsvoid (void)>::arity 值为0的整形常量表达式 functio...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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