【问题标题】:C++11 template alias for a method callback方法回调的 C++11 模板别名
【发布时间】:2013-06-15 19:49:52
【问题描述】:

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

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

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

我希望能够重写 Bar() 原型,以便它使用一种类型,因为我将在实现中的多个地方使用相同的类型。我尝试使用下面的新 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 参考网站上找不到这样的示例。

【问题讨论】:

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


    【解决方案1】:

    这种方式是行不通的。这个:

    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); 
    

    【讨论】:

    • 调用回调的正确方法是什么?当我这样称呼它时: instance->*callback(parameter);我收到以下错误:callback.cpp:12:21: error: called object type 'Callback' (aka 'void (Object::*)(int *)') is not a function or function pointer实例->*回调(&值);这是clang 3.1。 gcc 4.8 给了我一个类似的错误。谢谢!
    • @user2180977:你试过在instance-&gt;*callback周围加上括号吗?像这样:(instance-&gt;*callback)(parameter);
    • @user2180977:很高兴它有帮助:)
    【解决方案2】:

    您需要包含模板参数:

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

    【讨论】:

      【解决方案3】:

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

      这行得通:

      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);
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多