我现在正在为一些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的建议修正了拼写错误。但那仍然行不通。
答案 0 :(得分:1)
template <typename F> wrapper;
无效。你是说template <typename F> struct wrapper;
吗?如果您解决了这个问题,那么明显的语法就可以了:
typedef wrapper<decltype(recv)>::type recv_wrapper_t;