我正在尝试使用C ++(C ++ 17很好)构造一个具有一个参数的构造函数,并且我希望将此参数从两种类型继承。
所以我有这个结构:
struct SceneNodeData {
Drawable* drawable;
Transformable* transformable;
SceneNodeData(
Drawable* drawable,
Transformable* transformable
) : drawable(drawable), transformable(transformable) {}
};
但是为了方便起见,我想要另一个构造器,它只有一个参数,即同时为Drawable
和Transformable
(例如Sprite
):
struct SceneNodeData {
Drawable* drawable;
Transformable* transformable;
SceneNodeData(
<Drawable, Transformable>* drawableAndTransformable
) : drawable(drawableAndTransformable), transformable(drawableAndTransformable) {}
};
在C ++中有什么方法可以做到这一点吗?
答案 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)
不完全是,但是
DrawableTransformable
和Drawable
公开派生的类Transformable
,并让构造函数使用类型DrawableTransformable*
的参数。从DrawableTransformable
派生的任何具体类都需要实现Drawable
和Transformable
的纯虚函数。T*
是从T
和Drawable
公开派生而来的,Transformable
。或者,您可以省略SFINAE检查,而仅在初始化drawable
和transformable
时出现一个硬错误。