具有多个参数的模板化 class 特化,其中一个模板参数是模板本身
Templated class specialization with multiple arguments where one template argument is a template itself
我认为只显示一些代码是最简单的:
template<typename T>
struct TemplateTest { //<-- generic version
using typeGeneric = int;
};
template<>
struct TemplateTest<std::vector<int>> { //<-- specialized with specialized version of vector
using typeVectorInt = int;
};
template<typename T>
struct TemplateTest<std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
int main (int argc, char** argv) {
typename TemplateTest<int>::typeGeneric var1;
typename TemplateTest<std::vector<int>>::typeVectorInt var2;
typename TemplateTest<std::vector<char>>::typeVectorT var3;
return 0;
}
一切正常,符合预期。由于我在不同的专业化中使用了不同的使用名称,因此如果在编译期间选择了非预期的专业化,则会出现编译错误。 (我这样做只是为了这个 post 来说明问题)
然而这并没有像预期的那样工作:
template<typename Tfirst, typename Tsecond>
struct TemplateTest { //<-- generic version
using typeGeneric = int;
};
template<typename Tfirst>
struct TemplateTest<Tfirst, std::vector<int>> { //<-- specialized with specialized version of vector
using typeVectorInt = int;
};
template<typename Tfirst>
template<typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
int main (int argc, char** argv) {
typename TemplateTest<int, int>::typeGeneric var1;
typename TemplateTest<int, std::vector<int>>::typeVectorInt var2;
typename TemplateTest<int, std::vector<char>>::typeVectorT var3;
return 0;
}
var3 是问题所在。矢量专业化不起作用(编译器未选择),我不知道为什么。这可以做到吗?如果可以,怎么做?
谢谢!
您声明的 2nd specialization 语法错误(带有无关的模板参数列表);将其更改为
template<typename Tfirst, typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
我认为只显示一些代码是最简单的:
template<typename T>
struct TemplateTest { //<-- generic version
using typeGeneric = int;
};
template<>
struct TemplateTest<std::vector<int>> { //<-- specialized with specialized version of vector
using typeVectorInt = int;
};
template<typename T>
struct TemplateTest<std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
int main (int argc, char** argv) {
typename TemplateTest<int>::typeGeneric var1;
typename TemplateTest<std::vector<int>>::typeVectorInt var2;
typename TemplateTest<std::vector<char>>::typeVectorT var3;
return 0;
}
一切正常,符合预期。由于我在不同的专业化中使用了不同的使用名称,因此如果在编译期间选择了非预期的专业化,则会出现编译错误。 (我这样做只是为了这个 post 来说明问题)
然而这并没有像预期的那样工作:
template<typename Tfirst, typename Tsecond>
struct TemplateTest { //<-- generic version
using typeGeneric = int;
};
template<typename Tfirst>
struct TemplateTest<Tfirst, std::vector<int>> { //<-- specialized with specialized version of vector
using typeVectorInt = int;
};
template<typename Tfirst>
template<typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
int main (int argc, char** argv) {
typename TemplateTest<int, int>::typeGeneric var1;
typename TemplateTest<int, std::vector<int>>::typeVectorInt var2;
typename TemplateTest<int, std::vector<char>>::typeVectorT var3;
return 0;
}
var3 是问题所在。矢量专业化不起作用(编译器未选择),我不知道为什么。这可以做到吗?如果可以,怎么做?
谢谢!
您声明的 2nd specialization 语法错误(带有无关的模板参数列表);将其更改为
template<typename Tfirst, typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};