大佬教程收集整理的这篇文章主要介绍了c – 为什么我们必须为带有默认参数的模板类指定<>?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于模板功能,我们可以:
// Function declaration/deFinition template<bool Option = false> void MyFunction() { std::cout<<"Option = "<<Option<<std::endl; } // Then I can use : MyFunction<false>(); MyFunction<true>(); MyFunction(); // <- NO PROBLEM HERE
现在是模板类:
// Class deFinition/declaration template<bool Option = false> class MyClass { }; // Then I can use : myClass<false> x; myClass<true> y; myClass z; // <- PROBLEM HERE : only "MyClass<> z;" will compile !
为什么这种行为的原因?
有什么诀窍可以避免吗?
对于具有作为模板传递的optionnal参数的类,我发现这对最终用户来说不方便:他应该能够将默认实现用作非模板化类…
当您编写函数调用时,编译器会使用该名称填充它可以找到的所有函数的重载集,然后确定哪些函数与传递的参数匹配.现在,为了使用函数模板干净地工作,它允许从参数中推导出模板参数类型.因为通常允许类型参数推断,所以即使参数是默认的,它也适用于您的情况.
但是,类型不会超载.虽然MyFunction< true>()和MyFunction< false>()都与他们将参与相同重载集的范围相关,但myClass< true>和MyClass< false>是分开的和不相关的类型.由于类型名称没有相应的重载,因此没有动机为隐式命名完全专用的模板类添加特殊情况.永远不会推断出这些参数,因此只有在它们全部默认的情况下它才会成为特殊语法.
通常,如果要获取模板类的模板参数推导,可以提供模板函数包装器(这最适用于C 11 auto)
template <bool Option=false> class MyClass {}; template <bool Option=false> MyClass<Option> make_my_class() { return MyClass<Option>(); } // ... auto z = make_my_class();
否则,我认为使用typedef(根据Remy的评论)是最好的选择.
以上是大佬教程为你收集整理的c – 为什么我们必须为带有默认参数的模板类指定<>?全部内容,希望文章能够帮你解决c – 为什么我们必须为带有默认参数的模板类指定<>?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。