我想将参数类型为Sub
的函数向上转换为另一个参数类型为Base
的函数类型。 (Sub
延伸Base
)
std::function<void(Sub)> child_f = ...
std::function<void(Base)> base_f = static_cast<std::function<void(Base)>>(child_f);
上面的代码不起作用。谁能告诉我出了什么问题?
答案 0 :(得分:2)
std::function<void(Base)>
与签名void(Sub)
不兼容,因为无法从Base
转换为Sub
。
反之则不然。 std::function<void(Sub)>
与签名void(Base)
兼容,因为存在转换以从Sub
转换为Base
。这意味着以下将工作:
std::function<void(Base)> base_f = someFunction;
std::function<void(Sub)> child_f = base_f;
答案 1 :(得分:0)
上面的代码不起作用。谁能告诉我出了什么问题?
您期望std::function<void(Sub)>
可以投放到std::function<void(Base)>
是没有根据的。尽管Base
和Sub
之间存在关系,但它们是两种不相关的类型。
采取一个更简单的案例:
template <typename T> struct Empty {};
Empty<Sub> e1;
Empty<Base> e2 = static_cast<Empty<Base>>(e1); // Not going to work either
因为Empty<Sub>
与Emtpy<Base>
没有基类/派生类关系。
底线:你不能做正在尝试做的事情。