C++ 如何提取传入模板参数的类型?

C++ 如何提取传入模板参数的类型?,c++,c++11,templates,parameters,template-classes,C++,C++11,Templates,Parameters,Template Classes,在下面的代码中,我想将“something”替换为允许我将“f”的类型声明为在C中传递的第二个参数(同时将C传递给M的模板),即这里的float #include<iostream> using namespace std; template<class A, class B> class C{ public : A a; B b; }; template<class D> class M{ public :

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

#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();
}
#包括
使用名称空间std;
模板
C类{
公众:
A A;
B B;
};
模板
M类{
公众:
decltype(D::)f;/!!!!!!!!!!!!!!!!

void show(){cout模板取模板怎么样

通过以下行,您可以声明一个模板,并将后者的模板参数类型命名为:

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

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

模板取模板怎么样

通过以下行,您可以声明一个模板,并将后者的模板参数类型命名为:

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

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

您可以通过一些技巧来实现这一点

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;//保留未定义
模板
M{//a类专业
两个f;
};

现在,您可以传递给
M
一个正好有两个模板参数的类(sich为
C
)。如果传递其他参数(例如
int
),则会出现错误。

您可以通过一些技巧来实现这一点

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;//保留未定义
模板
M{//a类专业
两个f;
};

现在你可以传递给
M
一个正好有两个模板参数的类(sich为
C
)。如果你传递了其他一些参数(例如
int
),就会出现错误。

decltype(D::b)
对你来说足够好吗?不,没有看到。没有查看类C的定义。@QuentinIs
decltype(D::b)
对你来说足够好吗?不,没有看到。没有研究C类的定义。@quentin你能解释一下行模板