#include <tuple>
#include <iomanip>
template <typename T, typename ...L>
struct foo{};
template <typename T>
struct bar{
using toto = T;
};
template <template<typename T, typename ...L> class F>
struct bar<F>{
using toto = T
};
int main(){
bar<foo<int,char,char>> a;
}
当参数是一个至少有一个模板参数bar
<typename T, typename ...L>
我试过了:
template <template<typename T, typename ...L> class F>
struct bar<F<T,L...>>{
using toto = T
};
和
template <template<typename , typename ...> class F, typename T, typename ...L>
struct bar<F<T,L...>>{
using toto = T
};
这可能是有道理的,但我无法做到正确
答案 0 :(得分:1)
你的构思代码只有一堆印刷错误:
struct bar<F<T,...L>>{
//should be
struct bar<F<T,L...>>{
//missing brackets
int main{
//missing semicolon
using toto = T
bar<foo, int,char,char> a;
//should be
bar<foo<int,char,char>> a;
答案 1 :(得分:1)
你在样本上遗忘了很多东西,语法上说话
template <typename T, typename... L>
struct foo{};
template <typename T>
struct bar {
using toto = T; // Semicolon missing
};
template <template<typename, typename...> class F, typename T, typename... L>
struct bar<F<T,L...>> { // Wrong pack expansion
using toto = T;
};
int main() { // () missing
bar< foo<int,char,char> > a; // Pass the parameters to foo since you're
// partially specializing bar to just do that
}
答案 2 :(得分:0)
这里有一些合成问题。
bar
是一个采用一种类型参数的模板。因此bar
的任何部分或显式特化也必须采用一种类型参数。
template <template<typename T, typename ...L> class F>
struct bar<F> {
此处,T
和L
名称无关紧要,而且您真正专注于模板模板。这并不匹配。您必须专注于F
的特定实例化:
template <template<typename , typename ...> class F,
typename T, typename... L>
struct bar<F<T, L...>> {
您错过了分号:
using toto = T;
^^
您对main
的声明缺少括号:
int main() {
bar<foo<int,char,char>> a;
}