是否可以将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参考网站上工作的例子。
答案 0 :(得分:6)
它不起作用。这样:
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);
答案 1 :(得分:2)
您需要包含模板参数:
template <typename U, typename T>
void Bar(Callback<U, T> callback);
答案 2 :(得分:2)
我明白了。 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);
};