我想将其参数类型为 Sub
的函数上升到另一个函数类型,其参数为类型 Base
。(Sub
扩展Base
(
std::function<void(Sub)> child_f = ...
std::function<void(Base)> base_f = static_cast<std::function<void(Base)>>(child_f);
上面的代码不起作用。谁能告诉我出了什么问题?
std::function<void(Base)>
与签名void(Sub)
不兼容,因为从Base
转换为Sub
。
相反的不是真的。std::function<void(Sub)>
与签名void(Base)
兼容,因为存在转换以从Sub
转换为Base
。这意味着以下 Will 工作:
std::function<void(Base)> base_f = someFunction;
std::function<void(Sub)> child_f = base_f;
上面的代码不起作用。谁能告诉我出了什么问题?
您对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>
没有基类/派生类关系。
底线:您无法做任何正在尝试做的事情。