对函数的decltype感到沮丧

时间:2014-03-19 18:11:18

标签: c++ function typetraits

我现在正在为一些Windows库函数编写包装器,所以我需要提取他们的原型并编写一个带有修改原型的新包装器。例如:函数

int recv(SOCKET, char*, int, int)

将被

包裹
recv_wrapper(SOCKET, char*, int, int, THREADID)

为了避免错误,我写了一个包装模板:

template <typename F> struct wrapper;

template <typename R, typename T1, typename T2, typename T3, typename T4>
struct wrapper<R(T1,T2,T3,T4)> 
{
  typedef R result_type;
  typedef R (type)(T1,T2,T3,T4,THREADID);
};

然后以下包装类型有效

typedef int recv_t(SOCKET,char*,int,int);
typedef wrapper<recv_t>::type recv_wrapper_t;

但是我想进一步使用decltype来自动获取recv的类型:

typedef decltype(recv) recv_t;
typedef wrapper<recv_t>::type recv_wrapper_t;

但是这个不起作用,我尝试了几种方法来修改它,但我总是从VS2010编译器得到错误:

error C2027: use of undefined type 'wrapper<F>'
with
        [
            F=int (SOCKET,char *,int,int)
        ]

error C2146: syntax error : missing ';' before identifier 'recv_wrapper_t'

我对此感到非常沮丧,因为此处F只是明确定义的recv_t

typedef int recv_t(SOCKET,char*,int,int);

但是当使用decltype自动获取时,它将不再有效。

非常感谢您的任何考虑。

N.B。我按照n.m的建议修正了拼写错误。但那仍然行不通。

1 个答案:

答案 0 :(得分:1)

template <typename F> wrapper;无效。你是说template <typename F> struct wrapper;吗?如果您解决了这个问题,那么明显的语法就可以了:

typedef wrapper<decltype(recv)>::type recv_wrapper_t;