cho*_*ger 4 c++ templates default-arguments
我知道很多关于模板默认参数语法的问题.
通常,答案(与我对它应该如何工作的理解同步)是使用类似的东西:
template <class T = SomeDefault> class T1 {};
Run Code Online (Sandbox Code Playgroud)
最近我想检查Boost在其中使用哪个地图实现mapped_vector
.并找到以下代码段:
template<class T, class A>
class mapped_vector:
Run Code Online (Sandbox Code Playgroud)
显然,参数没有默认绑定A
,但显然,我可以实例化mapped_vector<int>
一下就好了.Obviosuly以某种方式推断出默认参数,但是如何?
编辑:准确地说,我在谈论这个文件中的第279行
这里的行(@ Xeo的链接)声明了模板.链接中的行定义它.注意:您不能指定一个在定义再次默认情况下,如果你决定要一个声明.
这有效:( Boost的版本)
template<typename T = int> class A;
template<typename T> class A {};
Run Code Online (Sandbox Code Playgroud)
template<typename T = bool> class A;
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)
这既不是:
template<typename T = int> class A;
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)
请注意,您必须在任何一个中声明它.这有效:
template<typename T> class A;
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)
虽然默认值只能声明一次,但它们不必全部在同一部件中声明.这有效,但请不要这样做:
template<class T, class U = bool> class A;
template<class T = int, class U> class A {};
Run Code Online (Sandbox Code Playgroud)
......没有限制,真的.这有效 :(责怪 - 或者谢谢 - @Xeo)
template<class T, class U, class V = double> class A;
template<class T, class U = bool, class V> class A;
template<class T = int, class U, class V> class A {};
Run Code Online (Sandbox Code Playgroud)
当然,你不会被迫提出声明.这有效:
template<typename T = int> class A {};
Run Code Online (Sandbox Code Playgroud)