如何提取模板参数中传递的类型?
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 是一个模板参数,它本身又是一个模板,A
和 B
是它采用的类型。
现在您可以使用名称 A
和 B
.
引用 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
),将会出现错误。
在下面的代码中,我想将 "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 是一个模板参数,它本身又是一个模板,A
和 B
是它采用的类型。
现在您可以使用名称 A
和 B
.
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
),将会出现错误。