【问题标题】:Automatic creation of constructor, based on parent class' constructor (C++)自动创建构造函数,基于父类的构造函数(C++)
【发布时间】:2009-09-18 14:17:10
【问题描述】:

这是我想要开始工作的代码:

template <class A>
class B : public A {
public:
  // for a given constructor in A, create constructor with identical parameters,
  // call constructor of parent class and do some more stuff
  B(...) : A(...) {
    // do some more stuff
  }
};

是否可以实现上述示例所描述的行为?

【问题讨论】:

    标签: c++ templates constructor


    【解决方案1】:

    不,这目前在 C++ 中是不可能的。它被称为“完美转发”,在 C++0x 中是允许的。您可以通过为 const 和非 const 引用生成最多固定最大值(例如 8 个参数)的构造函数的重载来模拟它。这仍然不完美(临时文件不会作为临时文件转发),但通常在实践中有效:

    template<typename T1>
    B(T1 &a1):A(a1) { 
      // do some more stuff
    }
    
    template<typename T1>
    B(T1 const &a1):A(a1) { 
      // do some more stuff
    }
    
    template<typename T1, typename T2>
    B(T1 &a1, T2 &a2):A(a1, a2) { 
      // do some more stuff
    }
    
    template<typename T1, typename T2>
    B(T1 const &a1, T2 const &a2):A(a1, a2) { 
      // do some more stuff
    }
    
    template<typename T1, typename T2>
    B(T1 const &a1, T2 &a2):A(a1, a2) { 
      // do some more stuff
    }
    
    template<typename T1, typename T2>
    B(T1 &a1, T2 const &a2):A(a1, a2) { 
      // do some more stuff
    }
    
    // ...
    

    可以使用 Boost.Preprocessor 或某些脚本自动生成,但它并不是很好,因为重载的数量增长很快。

    简而言之 - 在 C++0x 可用之前不要自己编写构造函数,它支持 both 对任何函数的完美转发,以及特殊的构造函数转发 ("using A::A;")。

    【讨论】:

    • 请阅读我的回答。这就是您所说的“使用 A::A”吗?还是有什么不同?
    【解决方案2】:

    我已经深入研究了 STL,并根据我在那里找到的内容,确定了以下代码:

    template <class Data>
    class Node : public Data {
    public:
    
      template<typename... _Args>
      Node (_Args&&... __args) : Data (std::forward<_Args>(__args)...) {
      }
    
      // ...
    };
    

    它适用于命令:

    g++ -std=c++0x -c code.cpp

    【讨论】:

    • 告诉你你使用的 g++ 版本会有所帮助。
    • g++-4.4 在当前 Ubuntu 的 gcc-snapshot 包中可用。
    • Those identifiers aren't meant to be used by you。顺便说一句,您可能应该在问题中提到 C++0x 是您的一个选项。这是最接近构造函数继承的东西,是的。
    【解决方案3】:

    看看最近发布的文章

    Use C++0x's Inheriting Constructors to Reduce Boilerplate Code in Class Hierarchies

    在http://www.devx.com.

    它可能为您的问题描述了一个未来解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2020-11-28
      • 2013-08-04
      • 1970-01-01
      • 2015-03-15
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多