我遇到了以下困境,在我的代码中,我有三个类遵循一种模式,其中某些函数和构造函数在所有三个中都是相同的。为了解决这个问题,我创建了一个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 packs和variadic 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...)
}
此用例是否有替代方案或更好的答案?