如何提取模板参数中传递的类型?

在下面的代码中,我想用一些东西代替“ 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();
}
wuyuesuper 回答:如何提取模板参数中传递的类型?

以模板为模板怎么办?

在下面的行中,您可以声明一个采用模板的模板,并将后者的模板参数类型命名为:

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

使用这种表示法是说D是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 B>
class M{
    public :
        B f;  //!!!!!!!!!!!!!!!!
        void show(){cout<<f;}
};
int main(){
    M<C,int,float> m;
    m.show();
}

有关更多信息,请查看this答案。

,

您可以通过圆顶骗术来做到这一点。

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<int,float>。如果您传递其他内容(例如int),则会出现错误。

本文链接:https://www.f2er.com/3165011.html

大家都在问