我有一个基类型
template<int p>
struct Base {};更复杂的东西建立在许多版本的Base上(一些是int-template,一些是class-template):
template<template<auto inner> typename basetype, typename p, typename q>
struct Complex {};然后,我像这样创建变量:
Complex<Base, Base<1>, Base<2>> c;有没有办法推断出我的第一个模板参数是Base,或者p和q是basetype的专用版本,这样我就可以编写
Complex<Base<1>, Base<2>> c;我想没有,但是模板有时隐藏着一些魔力。
发布于 2019-05-24 22:36:13
如果您希望Complex始终将其两个参数作为同一模板的专门化,则可以使用部分专门化来实现:
// the primary template remains incomplete, so most uses of it will be an error
template <class T, class U> struct Complex;
template <template<auto> typename basetype, auto p_arg, auto q_arg>
struct Complex<basetype<p_arg>, basetype<q_arg>> {
// ...
};实例化Complex<Base<1>, Base<2>>时,参数basetype、p_arg和q_arg将分别推导为Base、1和2。
发布于 2019-05-25 00:58:16
是的,假设维护手动输入基类模板的选项仍然是更可取的,那么有一种方法可以自动推断基类模板,只需稍作修改。
模板参数的顺序应该更改,以允许从默认参数推断基类模板:
template<typename p, typename q, template<auto> class basetype = Complex_helper<p, q>::template base>
struct Complex {};并添加辅助模板,如下所示:
template<template<auto> class basetype, auto p, auto q>
struct Complex_helper<basetype<p>, basetype<q> >{
template<auto x>
using base = basetype<x>;
};它(通过使用专门化)将为Base (base)提供一个alias template,或者如果它的两个类型参数都是从同一个类模板驱动的,则提供任何其他类模板。
把所有这些放在一起:
template<int p>
struct Base {};
template<int p>
struct Another_Base {};
template<typename, typename>
struct Complex_helper;
template<template<auto> class basetype, auto p, auto q>
struct Complex_helper<basetype<p>, basetype<q> >{
template<auto x>
using base = basetype<x>;
};
template<typename p, typename q, template<auto> class basetype = Complex_helper<p, q>::template base>
struct Complex {};
Complex<Base<1>, Base<2> > object1;
Complex<Another_Base<7>, Another_Base<8> > object2;
Complex<Base<5>, Base<8>, Base> object3;
Complex<Another_Base<2>, Another_Base<9>, Another_Base> object4;
Complex<Base<78>, Base<87>, Another_Base> object5;
Complex<Another_Base<29>, Another_Base<92>, Base> object6;如您所见,您还可以手动输入类模板。
祝好运!
https://stackoverflow.com/questions/56294688
复制相似问题