模板特化求解?

AmbitiousGuy 2012-05-23 02:36:14

template <typename Functor>
class RunnableAdapter;

template <typename R>
class RunnableAdapter<R(*)()> {
public:
typedef R (RunType)();

explicit RunnableAdapter(R(*function)())
: function_(function) {
}

R Run() {
return function_();
}

private:
R (*function_)();
};

void fun()
{
cout<<"Hello world!"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
RunnableAdapter<void(__cdecl*)(void)> b(&fun);
b.Run();
system("pause");
return 0;
}

想不明白,为什么function_这个函数指针,指向的函数类型跟fun的类型不同,还可以用fun的地址初始化function_
...全文
129 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
AmbitiousGuy 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

不是 R 被替换, 是 R(*)() 被替换成 void(__cdecl*)(void)
<<C++ Templates>>
<<Modern C++ Design>>
[/Quote]

可不可以这样理解,也就是说template <typename R> class RunnableAdapter<R(*)()>仍然是一个模版类,但它是对template <typename Functor> class RunnableAdapter的一个特化。将Functor特化为返回为任意类型接受参数为空的函数指针类型。
非常感谢你得回答,等下再发一贴,再给你50分,谢谢
www_adintr_com 2012-05-23
  • 打赏
  • 举报
回复
不是 R 被替换, 是 R(*)() 被替换成 void(__cdecl*)(void)
<<C++ Templates>>
<<Modern C++ Design>>
AmbitiousGuy 2012-05-23
  • 打赏
  • 举报
回复
最后还有一点不明白的地方就是,当我们RunnableAdapter<void(__cdecl*)(void)> b(&fun);这样实例化的时候,模板参数R不应该是被完整替换为void(__cdecl*)(void)吗?当然这里的调用约定__cdecl是c++默认调用约定。最后可以介绍一本关于模板比较好点的书么?c++ primer我有了。
www_adintr_com 2012-05-23
  • 打赏
  • 举报
回复
template <typename Functor>
class RunnableAdapter;
声明了一个模版类, 这个模版类带一个类型模版参数.

template <typename R>
class RunnableAdapter<R(*)()>
定义了这个模版类的一个偏特化形式, 即当 RunnableAdapter 的模版参数是一个不带参数的函数指针时, 重新指定这个类的定义形式为之后的那串代码.

RunnableAdapter<void(__cdecl*)(void)> b(&fun); 用 void(__cdecl*)(void) 类型作为模版参数来实例化 RunnableAdapter 模版类. 编译器检查这个类的所有特化版本, 找出其中最为匹配的, 显然这里 void(__cdecl*)(void) 和 RunnableAdapter<R(*)()> 的匹配度比 void(__cdecl*)(void) 和 RunnableAdapter<Functor> 更高. (如果还有 RunnableAdapter<void (*)()> 这种特化版本的话, 匹配度会更高). 所以编译器使用 RunnableAdapter<R(*)()> 版本来生成实例, 并根据参数的形式自动推导出 R 的类型为 void. 之后就是把 void 替换 R 来生成这个类了.
AmbitiousGuy 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

通用模版的参数 Functor 的类型是 void(__cdecl*)(void)
特化模版的参数 R 的类型是 void
所以, function_ 的类型是 void (*)()
[/Quote]
可以详细解释下这个过程么?分不够可以加
www_adintr_com 2012-05-23
  • 打赏
  • 举报
回复
通用模版的参数 Functor 的类型是 void(__cdecl*)(void)
特化模版的参数 R 的类型是 void
所以, function_ 的类型是 void (*)()
AmbitiousGuy 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

怎么不相同了? 都是没有参数返回 void 类型的.
[/Quote]
在这个测试里面,如果扩展开来的话,那么应该是void(__cdecl*)(void) (*function_)();那么function_函数指针所指向的函数的返回类型才是fun的类型,但是function_所指向的函数类型跟fun的类型是不一样的
www_adintr_com 2012-05-23
  • 打赏
  • 举报
回复
怎么不相同了? 都是没有参数返回 void 类型的.

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧