[英]C++11 constructor inheritance through variadic templates
最近,我遇到一个实例,在该实例中,我意识到自己编写的几个类共享许多功能。 我意识到我可以使用一些模板参数将这些类归纳为一个通用的基础。 问题在于这些类具有大约20个不同的重载构造函数,其中大多数类功能都在其中实现。 使用我想出的解决方案如下所示:
template <typename T>
class Base {
protected:
T member_;
public:
Base(int a) { /* ... */ }
Base(double a) { /* ... */ }
Base(char a) { /* ... */ }
Base(int a, double b, char c) { /* ... */ }
// etc...
};
class Derived1 : public Base<int> {
public:
template <typename... Args>
Derived1(Args... args) : Base(args...) { }
// other constructors specific to Derived1
};
class Derived2 : public Base<char> {
public:
template <typename... Args>
Derived2(Args... args) : Base(args...) { }
// other constructors specific to Derived2
};
我在这里有几个问题:
std::forward
,对吗?) explicit
关键字。为什么?) 在C ++ 11中,可以继承构造函数。
是的,您应该使用完美的转发。 如果将构造函数声明为内联,则对性能的影响为零。
它是一个“看起来很恐怖的模板”,但是容易被对模板一窍不通的人所认识。 我猜取决于您的维护者吗?
您需要提防拦截旨在用于派生类的copy and move构造函数的调用,因为您可变的完美转发签名与所有内容都匹配。 正确限制enable_if
通常需要比转发构造函数本身更多的代码。
继承构造函数是执行此操作的“更好”方法。 指定该功能是为了避免捕获应该传递给派生类构造函数的签名。 编译器支持可能还很不稳定:它不是最容易实现的功能,也不是需求最大的功能,因此实现者将其推迟了一段时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.