在其他模板 class 中专门化可变参数模板 class 是否合法
Is it legit to specialize variadic template class inside other template class
考虑一段代码:
#include <iostream>
template <class T>
struct outer {
template <class... Args>
struct inner {
static constexpr bool value = false;
};
template <class... Other>
struct inner<T, Other...> {
static constexpr bool value = true;
};
};
int main() {
std::cout << outer<int>::inner<int, void>::value << std::endl;
};
它确实可以在 g++ 和 clang++ 中编译,但我不相信它是合法的。据我所知,如果不显式特化 class 本身,就不能为模板 class 特化模板方法。为什么内部 classes 的规则不同?
嵌套模板的部分特化 class 可以:
template <class T>
struct outer {
// template
template <class... Args>
struct inner {};
// partial
template <class... Other>
struct inner<T, Other...> {};
// error: explicit specialization in non-namespace scope ‘struct inner’
// template <>
// struct inner<char, int> {};
};
只有内部 class 的显式(完全)特化不是。
外部的显式特化class(没有内部的特化class(实际上是不同的class))和外部和内部的显式特化class 是可能的:
#include <iostream>
template <class T>
struct outer {
template <class... Args>
struct inner
{
static void print() { std::cout << "outer<T>::inner<Args...>\n"; }
};
};
template <> // outer specialization
struct outer<int>
{
template <class... Args>
struct inner
{
static void print() { std::cout << "outer<int>::inner<Args...>\n"; }
};
};
template <> // outer specialization
template <> // inner specialization
struct outer<int>::inner<int> // must be outside of the outer class
{
static void print() { std::cout << "outer<int>::inner<int>\n"; }
};
int main() {
outer<char>::inner<char>::print();
outer<int>::inner<char>::print();
outer<int>::inner<int>::print();
}
注意:这同样适用于非可变嵌套模板 classes.
考虑一段代码:
#include <iostream>
template <class T>
struct outer {
template <class... Args>
struct inner {
static constexpr bool value = false;
};
template <class... Other>
struct inner<T, Other...> {
static constexpr bool value = true;
};
};
int main() {
std::cout << outer<int>::inner<int, void>::value << std::endl;
};
它确实可以在 g++ 和 clang++ 中编译,但我不相信它是合法的。据我所知,如果不显式特化 class 本身,就不能为模板 class 特化模板方法。为什么内部 classes 的规则不同?
嵌套模板的部分特化 class 可以:
template <class T>
struct outer {
// template
template <class... Args>
struct inner {};
// partial
template <class... Other>
struct inner<T, Other...> {};
// error: explicit specialization in non-namespace scope ‘struct inner’
// template <>
// struct inner<char, int> {};
};
只有内部 class 的显式(完全)特化不是。
外部的显式特化class(没有内部的特化class(实际上是不同的class))和外部和内部的显式特化class 是可能的:
#include <iostream>
template <class T>
struct outer {
template <class... Args>
struct inner
{
static void print() { std::cout << "outer<T>::inner<Args...>\n"; }
};
};
template <> // outer specialization
struct outer<int>
{
template <class... Args>
struct inner
{
static void print() { std::cout << "outer<int>::inner<Args...>\n"; }
};
};
template <> // outer specialization
template <> // inner specialization
struct outer<int>::inner<int> // must be outside of the outer class
{
static void print() { std::cout << "outer<int>::inner<int>\n"; }
};
int main() {
outer<char>::inner<char>::print();
outer<int>::inner<char>::print();
outer<int>::inner<int>::print();
}
注意:这同样适用于非可变嵌套模板 classes.