通过可变参数模板进行C++11构造函数继承
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 中,构造函数可以继承。
请参阅 https://stackoverflow.com/a/434784/232574
-
是的,您应该使用完美的转发。如果构造函数以内联方式声明,则对性能的影响为零。
-
这是一个"看起来很吓人的模板",但很容易被对模板一无所知的人识别。取决于你的维护者,我猜?
-
您需要注意拦截用于派生类的复制和移动构造函数的调用,因为可变参数完美转发签名匹配所有内容。正确约束
enable_if
通常需要比转发构造函数本身更多的代码。 -
继承构造函数是执行此操作的"更好"方法。指定该功能是为了避免捕获应转到派生类构造函数的签名。编译器支持可能是不确定的:它不是最容易实现的功能,也不是最需要的功能,因此实现者将其推迟了相当长的一段时间。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++11:没有复制构造函数的自定义基于范围的循环
- 如何在C++11中区分填充构造函数和范围构造函数
- 移动构造函数 C++11
- 构造函数中调用没有匹配函数 - C++ 11
- 防止复制构造函数实例化 C++11 类"deleting"
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- SFINAE enable_if 使用 pre c++11 启用构造函数
- C 11构造函数参数:std ::移动和值或std :: forward and rvalue参考
- 通过可变参数模板进行C++11构造函数继承
- C++11构造函数继承和不带参数的构造函数
- C++11 - 构造函数继承
- initializer_list中的三元运算符+C++11构造函数
- C++11构造函数&析构函数顺序
- c++ 11构造函数重载解析和initialiser_lists: clang++和c++不一致.< / h1 &
- C++11构造函数
- C++11构造函数继承不起作用
- 带有可变通用引用和复制构造函数的c++11构造函数
- c++ 11构造函数的区别(大括号)
- c++ 11构造函数和操作符的统一初始化