【问题标题】:How to extract the types passed in template parameters?如何提取模板参数中传递的类型?
【发布时间】:2019-11-04 17:02:22
【问题描述】:

在下面的代码中,我想将“something”替换为允许我将“f”的类型声明为在 C 中传递的第二个参数(同时将 C 传递给 M 的模板)的东西,即,在此处浮动。

#include<iostream>
using namespace std;
template<class A, class B>
class C{
    public :
        A a;
        B b;
};
template<class D>
class M{
    public :
        decltype(D::<something>) f;  //!!!!!!!!!!!!!!!!
        void show(){cout<<f;}
};
int main(){
    M<C<int,float>> m;
    m.show();
}

【问题讨论】:

  • decltype(D::b) 够用吗?
  • 不,没有看到。无需研究 C 类的定义。@Quentin

标签: c++ c++11 templates parameters template-classes


【解决方案1】:

你可以用一些诡计来做到这一点。

template<typename> class M; // leave undefined
template<template<typename, typename> D, 
         typename One,
         typename Two>
 class M<D<One, Two>> { // a specialisation
     Two f;
 };

现在您可以将一个只有两个模板参数的类传递给M(如C&lt;int, float&gt;)。如果您传递其他内容(例如int),则会出现错误。

【讨论】:

    【解决方案2】:

    模板取模板怎么样?

    通过下面这行,你可以声明一个接受模板的模板,并命名后者的模板参数类型:

    template<
    template<typename, typename> class D, 
              typename A, typename B>
    

    使用这种表示法,您是说 D is a 是一个模板参数,它本身又是一个模板,AB 是它所采用的类型。 现在您可以使用名称AB 引用D 的第一个和第二个模板参数。


    using namespace std;
    template<class A, class B>
    class C{
        public :
            A a;
            B b;
    };
    template<template<typename, typename> class T, typename A, typename B>
    class M{
        public :
            B f;  //!!!!!!!!!!!!!!!!
            void show(){cout<<f;}
    };
    int main(){
        M<C, int, float> m;
        m.show();
    }
    

    欲了解更多信息,请查看this 回答。

    【讨论】:

    • 你能解释一下模板行中发生了什么 class T,typename A, typename B>
    • 为什么不用写 M,int,float>?
    • 你不要写C&lt;int,float&gt; 因为M 第一个模板参数现在是一个模板而不是一个类。请记住,C 是一个模板,但 C&lt;int,float&gt; 不再是一个模板。这是一个成熟的课程。
    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多