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

How to extract the types passed in template parameters?

在下面的代码中,我想将 "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();
}

模板拿模板怎么样?

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

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

用这个符号,你说 D 是一个模板参数,它本身又是一个模板,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 答案。

你可以用一些技巧来做到这一点。

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 传递一个恰好有两个模板参数的 class(例如 C<int, float>)。如果您传递其他内容(例如 int),将会出现错误。