【发布时间】:2014-12-11 18:29:03
【问题描述】:
首先,我定义了两个类,它们相互继承。
class A {
};
class B : public A {
};
然后,我声明一个使用 std::function<void(A*)> 的函数:
void useCallback(std::function<void(A*)> myCallback);
最后,我从其他地方收到了一个不同(但理论上兼容)类型的std::function,我想在我的回调函数中使用它:
std::function<void(B*)> thisIsAGivenFunction;
useCallback(thisIsAGivenFunction);
我的编译器 (clang++) 拒绝这样做,因为 thisIsAGivenFunction 的类型与预期的类型不匹配。但是由于B 继承自A,所以thisIsAGivenFunction 是可以接受的。
应该吗?如果不是,为什么?如果应该,那我做错了什么?
【问题讨论】:
-
C++ Templates polymorphism 的可能重复项
-
不重复,
std::function支持这样的转换。但另一方面,您可以将std::function<void(A*)>转换为std::function<void(B*)>,因为在A*上运行的函数在接收到B*的实例时可以执行相同的操作,但不是其他方式 -
问题的根源是使用
std::function作为回调,而不是接受Functor作为模板参数。除非你有充分的理由这样做,否则不要这样做。 -
您的回调将什么传递给您的
std::function?如果它将指向class C:public A{}的指针传递给它,那thisIsAGivenFunction会做什么呢?请回答这两个问题,都不是修辞。
标签: c++ c++11 std-function