首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法回调的C++11模板别名

方法回调的C++11模板别名
EN

Stack Overflow用户
提问于 2013-06-16 03:49:52
回答 3查看 952关注 0票数 2

是否可以将C++11模板别名用于方法回调?

我有一个模板化的方法,它接受一个方法回调作为它的输入参数之一,例如:

代码语言:javascript
复制
class Foo {
  public:
    template <typename OtherClass, typename T>
    void Bar(void (OtherClass::*callback)(T *));
};

我希望能够重写Bar()原型,以便它使用一个类型,因为我将在实现中的几个地方使用相同的类型。我尝试使用下面的新C++11别名,但不起作用。

代码语言:javascript
复制
class Foo {
  public:
     // This does not work
     template <typename OtherClass, typename T>
     using Callback = void (OtherClass::*)(T *object);

     void Bar(Callback callback);
};

我遗漏了什么?在我最喜欢的几个C++11参考网站上,我找不到一个这样做的例子。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-16 03:53:18

它不是这样工作的。这一点:

代码语言:javascript
复制
template <typename OtherClass, typename T>
using Callback = void (OtherClass::*)(T *object);

声明了一个别名模板,这意味着您必须实例化Callback才能获得类型。例如:

代码语言:javascript
复制
Callback<C, int>

将解析为:

代码语言:javascript
复制
void (C::*)(int*)

所以你的成员应该这样声明:

代码语言:javascript
复制
template<typename OC, typename T>
void Bar(Callback<OC, T> callback); 
票数 6
EN

Stack Overflow用户

发布于 2013-06-16 03:53:14

您需要包含模板参数:

代码语言:javascript
复制
template <typename U, typename T>
void Bar(Callback<U, T> callback);
票数 2
EN

Stack Overflow用户

发布于 2013-06-16 03:53:52

我想通了。Bar()方法也需要模板化。

这是可行的:

代码语言:javascript
复制
class Foo {
  public:
     template <typename OtherClass, typename T>
     using Callback = void (OtherClass::*)(T *object);

     template <typename OtherClass, typename T>
     void Bar(Callback<OtherClass, T> callback);
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17127328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档