从另一个模板类实例创建模板类的实例时,省略模板参数

jav*_*ver 2 c++ templates decltype c++14

我想T1,T2在创建类的实例时省略一些模板参数DeriveGenerator<T3,T4,T1,T2>来安慰我的生活.

这是我遇到的最终简化版本.

我的图书馆:-

重要的部分是阶级宣言.(this line)
他们的内部内容只是一个填充物.

template<class T1,class T2>class BaseGenerator{ //<-- this line
    public: std::pair<T1*,T2*> generateBase(){ 
        /** actually create T3,T4 internally */
        return std::pair<T1*,T2*>(nullptr,nullptr);
    }
};
template<class T3,class T4,class T1,class T2>class DeriveGenerator{ //<-- this line
    public: Base<T1,T2>* base;
    public: std::pair<T3*,T4*> generateDerive(){ 
        auto pp=base->generateBase();
        return std::pair<T3*,T4*>((T3*)(pp.first),(T4*)(pp.second));
    }
};
Run Code Online (Sandbox Code Playgroud)

用户:-

class B1{};class B2{};
class B3:public B1{};
class B4:public B2{};
int main() {
    //v this is what I have to
    BaseGenerator<B1,B2> baseGen;
    DeriveGenerator<B3,B4,B1,B2> deriveGen;  //so dirty #1
    deriveGen.base=&baseGen;
    deriveGen.generateDerive();
}
Run Code Online (Sandbox Code Playgroud)

是否可以使生产线#1更清洁?
我想要的类型deriveGen 取决于类型baseGen.

这是我的意愿: -

BaseGenerator<B1,B2> baseGen;
DeriveGenerator<B3,B4> deriveGen;   //<-- modified
deriveGen.base=&baseGen;
Run Code Online (Sandbox Code Playgroud)

或者至少是这样的: -

BaseGenerator<B1,B2> baseGen;
DeriveGenerator<B3,B4, DECLARATION_TYPE(baseGen) > deriveGen;   //<-- modified
deriveGen.base=&baseGen;
Run Code Online (Sandbox Code Playgroud)

我读过(仍然没有线索): -

我甚至不知道是否有可能.

" decltype "似乎是最接近的线索,但我无法找到将其应用于此案例的方法.
我想我可能要把它分成T1,T2......(?)

编辑

在实际情况中,baseGen是一些尚未实例化的类的非静态字段,例如

class Holder{
    public: BaseGenerator<B1,B2> baseGen;
};
Run Code Online (Sandbox Code Playgroud)

因此,在宣布时deriveGen,我无法达到真实的实例baseGen.
那是困难的部分.

不过,我可以参考baseGen类型decltype.
(抱歉没有提及)

Jar*_*d42 5

如果您可以将DeriveGenerator定义更改为:

template<class T3, class T4, class BaseT>
class DeriveGenerator{
public:
    BaseT* base = nullptr;

    std::pair<T3*, T4*> generateDerive(){ 
        auto pp = base->generateBase();
        return {(T3*)(pp.first), (T4*)(pp.second)};
    }
};
Run Code Online (Sandbox Code Playgroud)

您可以使用:

BaseGenerator<B1, B2> baseGen;
DeriveGenerator<B3, B4, decltype(baseGen)> deriveGen;
Run Code Online (Sandbox Code Playgroud)

另外我建议创建一个帮手:

 template <typename B3, typename B4, typename B1, typename B2>
 DeriveGenerator<B3, B4, B1, B2>
 MakeDerived(BaseGenerator<B1, B2>& baseGen)
 {
     DeriveGenerator<B3, B4, B1, B2> deriveGen;
     deriveGen.base = &baseGen;
     return deriveGen;
 }
Run Code Online (Sandbox Code Playgroud)

然后使用

BaseGenerator<B1,B2> baseGen;
auto deriveGen = MakeDerived<B3, B4>(baseGen);
Run Code Online (Sandbox Code Playgroud)