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

标签 c++ templates c++11 alias typedef

是否可以使用 C++11 模板别名进行方法回调?

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

class Foo {
  public:
    template <typename OtherClass, typename T>
    void Bar(void (OtherClass::*callback)(T *));
};

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

class Foo {
  public:
     // This does not work
     template <typename OtherClass, typename T>
     using Callback = void (OtherClass::*)(T *object);

     void Bar(Callback callback);
};

我错过了什么?我无法在我最喜欢的几个 C++11 引用网站上找到一个例子来说明它是如何工作的。

最佳答案

这样不行。这:

template <typename OtherClass, typename T>
using Callback = void (OtherClass::*)(T *object);

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

Callback<C, int>

将解析为:

void (C::*)(int*)

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

template<typename OC, typename T>
void Bar(Callback<OC, T> callback); 

关于方法回调的 C++11 模板别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17127328/

相关文章:

c++ - 解决C++中的别名问题

c++ - 为什么在 C++ 中使用 cin、cout 或 %I64d 优于 %lld 说明符?

c++ - reference_wrapper : make_pair VS Class Template Argument Deduction (CTAD)

c++ - 理解模板参数推导

c++ - 未按预期调用析构函数

c++ - 显示 mongodb 索引内容

c++ - 为什么我的三角形对象没有被绘制?

c++ - 静态数据成员模板特化的实例化点在哪里

c++ - 如何用一个结果集处理程序消除多个相似的 sql 查询?

c++ - static_assert 意外行为