使用CRTP创建一个CRTP类构造函数,该构造函数接受Base类和Derived Class的参数?

时间:2017-06-15 18:34:31

标签: c++ templates variadic-templates template-meta-programming crtp

我遇到了以下困境,在我的代码中,我有三个类遵循一种模式,其中某些函数和构造函数在所有三个中都是相同的。为了解决这个问题,我创建了一个CRTP类。

template<class Derived>
class BaseCRTP : public Base{

// example of what I'm extracting into this. 
BaseCRTP(const BaseCRTP<Derived>& rhs){
...
}
//other functions
...

}

我想要提取到我实现的CRTP中的一个函数没有相同的函数签名但是遵循了一个模式,这个函数看起来像这样:

//before CRTP
Derived( BaseParamType1 param1 BaseParamType2 param2 DerivedParamType1 param3 ...) : Base(param1, param2) {
   setMembers(param3, param4...)
}

对于每个派生类型,DerivedParamTypeN的类型和数量都会改变。

我想知道是否可以在CRTP中创建相同的构造函数,如下所示:

BaseCRTP(BaseParamType1 param1 BaseParamType2 param2 DerivedParameters...): Base(param1, param2){
    static_cast<Derived*>(this)->setMembers(derivedParameters)
}

我一直在调查parameter packsvariadic templates之类的内容,但我不确定这些是否是我问题的最佳解决方案,我在考虑做某事其中CRTP采用两个模板参数,如下所示:

template<class Derived, typename ... DerivedParams>
class BaseCRTP : public Base{
...
}

使用:

class Derived : public BaseCRTP<Derived, DerivedParamType1, DerivedParamType2, DerivedParamType3 ...>{
    public:
        using public BaseCRTP<Derived, DerivedParamType1, DerivedParamType2, DerivedParamType3 ...>:: BaseCRTP<Derived, DerivedParamType1, DerivedParamType2, DerivedParamType3 ...>
...
}

BaseCRTP(BaseParamType1 param1 BaseParamType2 param2 const DerivedParameters&... derivedParameters): Base(param1, param2){
    static_cast<Derived*>(this)->setMembers(derivedParameters...)
}

此用例是否有替代方案或更好的答案?

0 个答案:

没有答案