【发布时间】:2020-04-18 16:50:37
【问题描述】:
我有 许多 从基类派生的类。这些类必须从基类继承构造函数,但该构造函数只能用于派生类或基类实例。
基类示例:
template<typename T, typename U>
struct bar
{
bar() = default;
template<typename _Bar_or_Derived>
bar(const _Bar_or_Derived &); // must accept any bar or its derived classes
};
派生类示例:
template<typename T, typename U>
struct foo : public bar<T, U>
{
using bar<T, U>::bar;
// must inherit something like foo(const Foo_or_Bar&)
};
template<typename T, typename U>
struct not_foo : public bar<T, U>
{
using bar<T, U>::bar;
// must inherit something like not_foo(const NotFoo_or_Bar&)
};
这样的事情怎么办?
【问题讨论】:
-
继承似乎是一个孤注一掷的命题。要么继承构造函数,要么不继承构造函数。如果构造函数是模板,则要么继承模板,要么不继承模板。如果您不介意显式包装器,则可以手动声明带有可变参数的派生类构造函数,该构造函数将其参数从基类转发到实例化的模板构造函数。这可能是这里能做的最多的事情了。
-
但这将允许使用派生构造基类,不是吗?你能提供一些示例代码吗?
-
当然,因为 C++ 就是这样工作的,除非派生类私下继承基类。
-
听起来像XY problem。为什么你觉得有必要阻止构造函数接受派生类的实例?您要解决的最终问题是什么?
-
您想要某种 CRTP 吗?定义
bar(const foo<_T, _U>&)?
标签: c++ templates inheritance metaprogramming template-meta-programming