将函数向上转换为另一个基类参数

时间:2018-02-24 04:32:26

标签: c++ casting functor upcasting

我想将参数类型为Sub的函数向上转换为另一个参数类型为Base的函数类型。 (Sub延伸Base

std::function<void(Sub)> child_f = ...
std::function<void(Base)> base_f = static_cast<std::function<void(Base)>>(child_f);

上面的代码不起作用。谁能告诉我出了什么问题?

2 个答案:

答案 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)>是没有根据的。尽管BaseSub之间存在关系,但它们是两种不相关的类型。

采取一个更简单的案例:

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>没有基类/派生类关系。

底线:你不能做正在尝试做的事情。