C++ 选择,而不是如何选择基础模板的显式专门化。使用标准中的示例进行更新。我之前很快跳过了这一段,但我相信这正是我想要的。谢谢。这是我在标准中看到的第一个地方。我相信这与@怀疑论者的答案(即使答案只与函数模板相关)结合起来定义了这种行为。 template<
C++ 选择,而不是如何选择基础模板的显式专门化。使用标准中的示例进行更新。我之前很快跳过了这一段,但我相信这正是我想要的。谢谢。这是我在标准中看到的第一个地方。我相信这与@怀疑论者的答案(即使答案只与函数模板相关)结合起来定义了这种行为。 template<,c++,templates,language-lawyer,C++,Templates,Language Lawyer,选择,而不是如何选择基础模板的显式专门化。使用标准中的示例进行更新。我之前很快跳过了这一段,但我相信这正是我想要的。谢谢。这是我在标准中看到的第一个地方。我相信这与@怀疑论者的答案(即使答案只与函数模板相关)结合起来定义了这种行为。 template<int I, int J, class T> class X { }; template<int I, int J> class X<I, J, int> { }; // #1 template<int I
选择,而不是如何选择基础模板的显式专门化。使用标准中的示例进行更新。我之前很快跳过了这一段,但我相信这正是我想要的。谢谢。这是我在标准中看到的第一个地方。我相信这与@怀疑论者的答案(即使答案只与函数模板相关)结合起来定义了这种行为。
template<int I, int J, class T> class X { };
template<int I, int J> class X<I, J, int> { }; // #1
template<int I> class X<I, I, int> { }; // #2
template<int I0, int J0> void f(X<I0, J0, int>); // A
template<int I0> void f(X<I0, I0, int>); // B
template <auto v> class Y { };
template <auto* p> class Y<p> { }; // #3
template <auto** pp> class Y<pp> { }; // #4
template <auto* p0> void g(Y<p0>); // C
template <auto** pp0> void g(Y<pp0>); // D
template<typename T> concept C = requires (T t) { t.f(); };
template<typename T> concept D = C<T> && requires (T t) { t.f(); };
template<typename T> class S { };
template<C T> class S<T> { }; // #1
template<D T> class S<T> { }; // #2
template<C T> void f(S<T>); // A
template<D T> void f(S<T>); // B
template<class T> class stream;
template<> class stream<char> { /* ... */ };
template<class T> class Array { /* ... */ };
template<class T> void sort(Array<T>& v) { /* ... */ }
template<> void sort<char*>(Array<char*>&);