首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++模板模板推断类型参数

c++模板模板推断类型参数
EN

Stack Overflow用户
提问于 2019-05-24 22:28:57
回答 2查看 233关注 0票数 4

我有一个基类型

代码语言:javascript
复制
template<int p> 
struct Base {};

更复杂的东西建立在许多版本的Base上(一些是int-template,一些是class-template):

代码语言:javascript
复制
template<template<auto inner> typename basetype, typename p, typename q>
struct Complex {};

然后,我像这样创建变量:

代码语言:javascript
复制
Complex<Base, Base<1>, Base<2>> c;

有没有办法推断出我的第一个模板参数是Base,或者pqbasetype的专用版本,这样我就可以编写

代码语言:javascript
复制
Complex<Base<1>, Base<2>> c;

我想没有,但是模板有时隐藏着一些魔力。

EN

回答 2

Stack Overflow用户

发布于 2019-05-24 22:36:13

如果您希望Complex始终将其两个参数作为同一模板的专门化,则可以使用部分专门化来实现:

代码语言:javascript
复制
// 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>>时,参数basetypep_argq_arg将分别推导为Base12

票数 9
EN

Stack Overflow用户

发布于 2019-05-25 00:58:16

是的,假设维护手动输入基类模板的选项仍然是更可取的,那么有一种方法可以自动推断基类模板,只需稍作修改。

模板参数的顺序应该更改,以允许从默认参数推断基类模板:

代码语言:javascript
复制
template<typename p, typename q, template<auto> class basetype = Complex_helper<p, q>::template base>
struct Complex {};

并添加辅助模板,如下所示:

代码语言:javascript
复制
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,或者如果它的两个类型参数都是从同一个类模板驱动的,则提供任何其他类模板。

把所有这些放在一起:

代码语言:javascript
复制
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;

如您所见,您还可以手动输入类模板。

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56294688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档