【发布时间】:2013-09-30 07:48:09
【问题描述】:
所以我试图围绕 C++ 中的新可变参数模板进行思考,我想知道是否可以使用它来简化我拥有的一些代码。我有这样的事情:
template<typename FinalPatch,typename ReturnType, typename P1>
class Patch1: public PatchBase
{
public:
typedef Patch1<FinalPatch,ReturnType,P1> patch_type;
typedef ReturnType(WINAPI* FuncType)( P1 );
typedef std::function<ReturnType(P1)> function_type;
static ReturnType __stdcall exec( P1 p1 )
{
return _function(p1);
}
};
template<typename FinalPatch,typename ReturnType, typename P1, typename P2>
class Patch2: public PatchBase
{
public:
typedef Patch2<FinalPatch,ReturnType,P1,P2> patch_type;
typedef ReturnType(WINAPI* FuncType)( P1, P2 );
typedef std::function<ReturnType(P1,P2)> function_type;
static ReturnType __stdcall exec( P1 p1, P2 p2 )
{
return _function(p1, p2);
}
};
直到大约 10 个 P... 参数。
exec 静态方法用于类似 Detours 的系统中,它替换 WINAPI 函数,然后将其代理到 std::function 委托。
FuncType 表示“普通”函数指针。
是否可以使用可变参数模板将其简化为单个类?如果有,怎么做?
【问题讨论】:
-
typedef Patch1<FinalPatch,ReturnType,P1> patch_type即使在 C++03 中也不需要这样做,因为 injected-class-name。在类的范围内,名称Patch1指的是模板的这种特化。例如。typedef Patch1 patch_type; -
感谢您提供的信息。有几次我想知道是不是这样,但从来没有尝试过。
标签: c++ c++11 variadic-templates