MSVC C ++ 11:非标准构造函数继承

时间:2013-08-05 17:13:56

标签: api visual-c++ c++11 coding-style

在我的Windows Native C ++库中,我有时在构造函数方面过度使用它而不提供具有相同功能的实际方法(5-10个额外构造函数)。这使得基本扩展C ++类非常困难因为没有适当的构造函数继承(没有重新声明它们和转发调用)

我使用MSVC。 (是的,微笑你想要的一切!) 问题是:有没有办法继承构造函数,除了默认的构造函数/ copy-构造函数使用using因为,如果有人决定扩展我滥用构造函数(没有添加新属性和单继承)的类,那就是一场噩梦。 / p>

(示例代码)

class parent {
public:
    parent(){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
    // a non-standard constructor
    parent(const std::nullptr_t&):parent(){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
};

// adds nothing to parent but helper methods
// and maybe self-reliant properties with their own constructors
// so no constructor is required to initialize child class properties
class child: public parent {
public:
     // using parent::parent; // of no real use
    child(){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
    // need to forward call
    child(const std::nullptr_t&):parent(nullptr){
        std::cout << __FUNCTION__ << ':' << __LINE__ << std::endl;
    }
};

这种多构造函数继承的噩梦尤其发生在构建我的基础CRTP类时,需要扩展它以构建我的默认类,然后允许其他人扩展和构建自己的变体,同时保持可链接的方法功能(parent小孩)按顺序。

无论如何,在MSVC中,using parent::parent不会继承parent(const std::nullptr_t&)它是否应该符合C++11标准?我应该期待VC13中的这种功能吗?这将极大地影响我对公共重写的风格选择。

我也想知道为什么,对于C++11,他们没有弄清楚当我扩展单个类而不添加新属性时,它应该继承父的默认行为(构造函数,赋值运算符)等等。)。它只是有意义......编译器可以解决它。

2 个答案:

答案 0 :(得分:3)

根据Herb Sutter's talk at //build的VS2013路线图,继承构造函数不会在不久的将来进入VC ++:

VS2013 feature roadmap

他们是“有计划的”。

答案 1 :(得分:2)

委派/继承ctors:

parent(const std::nullptr_t&):parent() { /* ... */

这是一个委托ctor [class.base.init] / 6,而

using parent::parent;
根据C ++ 11标准[class.inhctor]

继承父母的ctors(除了复制/移动ctors之外的所有人)

  

问题是:除了使用?

的默认复制构造函数之外,有没有办法继承构造函数

是的,对于C ++ 11。 MSVC尚不支持,根据this MS site,VS2013将支持委托ctors(但不提及继承ctors)。

  

我也想知道为什么,对于C ++ 11,他们没有弄清楚当我扩展单个类而不添加新属性时,它应该继承父级的默认行为

没有假设。您的派生类可能需要以不同方式初始化。继承ctors用一行解决问题。


  

是否有类似版本3甚至远程可能?

我知道这个问题,但我不是最新的草案和提案,以便能够回答C ++ 1y的问题。对于C ++ 11,AFAIK,它是不可能的 - 你可以使用宏来缩短它(但不一定更好):

#define EMPTY
#define DEF_MYCLASS_MEM(RET) template <typename tnChar> RET MyClass<tnChar>::
#define MYCLASS_TYPE typename MyClass<tnChar>

DEF_MYCLASS_MEM(EMPTY) MyClass() {}

DEF_MYCLASS_MEM(MYCLASS_TYPE::tString) Method1(const tString& aParam) const {
    return aParam;
}