繁体   English   中英

通过可变参数模板的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

};

我在这里有几个问题:

  1. 是否有与此相关的运行时性能下降? (环顾四周后,似乎我应该在派生类中使用rvalue引用和std::forward ,对吗?)
  2. 从代码可维护性的角度来看,这是一个好主意吗?
  3. 这种方法有哪些陷阱? (例如,其他地方的类似示例似乎正在使用explicit关键字。为什么?)
  4. 是否有更好,更标准,更安全或更具可读性的方法来执行此操作?

在C ++ 11中,可以继承构造函数。

参见https://stackoverflow.com/a/434784/232574

  1. 是的,您应该使用完美的转发。 如果将构造函数声明为内联,则对性能的影响为零。

  2. 它是一个“看起来很恐怖的模板”,但是容易被对模板一窍不通的人所认识。 我猜取决于您的维护者吗?

  3. 您需要提防拦截旨在用于派生类的copy and move构造函数的调用,因为您可变的完美转发签名与所有内容都匹配。 正确限制enable_if通常需要比转发构造函数本身更多的代码。

  4. 继承构造函数是执行此操作的“更好”方法。 指定该功能是为了避免捕获应该传递给派生类构造函数的签名。 编译器支持可能还很不稳定:它不是最容易实现的功能,也不是需求最大的功能,因此实现者将其推迟了一段时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM