gpt4 book ai didi

c++ - 从另一个模板类实例创建模板类实例时省略模板参数

转载 作者:太空狗 更新时间:2023-10-29 23:49:17 27 4
gpt4 key购买 nike

我想省略一些模板参数 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));
}
};

用户:-

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();
}

问题

是否可以制作 #1 行?清洁工?
我想要 deriveGen 的类型取决于 baseGen 的类型.

这是我想要的:-

BaseGenerator<B1,B2> baseGen;
DeriveGenerator<B3,B4> deriveGen; //<-- modified
deriveGen.base=&baseGen;

或者至少是这样的:-

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

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

我什至不知道这是否可能。

decltype”似乎是最接近的线索,但我找不到将其应用于此案例的方法。
我想我可能不得不将它拆分为 T1,T2 ....(?)

编辑

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

class Holder{
public: BaseGenerator<B1,B2> baseGen;
};

因此,在声明时deriveGen , 我无法到达 baseGen 的真实实例.
这是困难的部分。

我可以引用baseGen类型来自 decltype , 不过。
(抱歉没有提到它)

最佳答案

如果您可以将 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)};
}
};

您可能会使用:

BaseGenerator<B1, B2> baseGen;
DeriveGenerator<B3, B4, decltype(baseGen)> deriveGen;

否则我建议创建一个助手:

 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;
}

然后使用

BaseGenerator<B1,B2> baseGen;
auto deriveGen = MakeDerived<B3, B4>(baseGen);

关于c++ - 从另一个模板类实例创建模板类实例时省略模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43517158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com