同时继承两种类型的函数参数

时间:2019-05-03 15:56:30

标签: c++

我正在尝试使用C ++(C ++ 17很好)构造一个具有一个参数的构造函数,并且我希望将此参数从两种类型继承。

所以我有这个结构:

struct SceneNodeData {
    Drawable* drawable;
    Transformable* transformable;

    SceneNodeData(
        Drawable* drawable,
        Transformable* transformable
    ) : drawable(drawable), transformable(transformable) {}
};

但是为了方便起见,我想要另一个构造器,它只有一个参数,即同时为DrawableTransformable(例如Sprite):

struct SceneNodeData {
    Drawable* drawable;
    Transformable* transformable;

    SceneNodeData(
        <Drawable, Transformable>* drawableAndTransformable
    ) : drawable(drawableAndTransformable), transformable(drawableAndTransformable) {}
};

在C ++中有什么方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:4)

您可以使用模板并使用类型特征std::is_convertible来限制类型,以检查提供的类型是否可以转换为两种类型。看起来像

struct SceneNodeData {
    Drawable* drawable;
    Transformable* transformable;

    template<typename T, std::enable_if_t<std::is_convertible_v<T*, Drawable*> &&
                                          std::is_convertible_v<T*, Transformable*>, bool> = true>
    SceneNodeData(T* drawableAndTransformable) : drawable(drawableAndTransformable), transformable(drawableAndTransformable) {}
};

答案 1 :(得分:3)

不完全是,但是

  • 您可以定义从DrawableTransformableDrawable公开派生的类Transformable,并让构造函数使用类型DrawableTransformable*的参数。从DrawableTransformable派生的任何具体类都需要实现DrawableTransformable的纯虚函数。
  • 您可以定义一个构造器模板,并使用SFINAE检查T*是从TDrawable公开派生而来的,Transformable。或者,您可以省略SFINAE检查,而仅在初始化drawabletransformable时出现一个硬错误。