odi*_*erd 7 c++ templates template-templates variadic-templates c++11
如果我希望模板模板参数有一个争论,那么我可以声明如下:
template<template<typename> class T>
struct S {
T<int> t_;
//other code here
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我以后想要提供一个模板模板参数,该参数需要两个参数,其中第二个具有默认值(如std :: vector)T<int> t_;
仍然有效,但模板不匹配template<typename> class T
.我可以通过制作template<typename> class T
一个可变参数模板模板来解决这个问题template<typename...> class T
.现在我的代码更灵活了.
我将来可以将所有模板模板参数变为可变参数吗?有什么理由我不应该(因为其他原因我的代码已经需要C++ 11支持)?
首先,文档.如果参数是可变参数,则用户现在需要检查一些其他源,以发现这确实需要一些需要一个模板参数的东西.
第二,提前检查.如果您不小心将两个参数传递给T
in S
,编译器将不会告诉您它是否为variadic,直到用户实际尝试使用它为止.
第三,错误消息.如果用户传递实际需要两个参数的模板,则在可变参数版本中,编译器将在S
实例化的行上给出错误消息,其中T
包含所有回溯内容.在固定版本中,他在实例化时获得错误S
.
第四,没有必要,因为模板别名也可以解决这个问题.
S<vector> s; // doesn't work
// but this does:
template <typename T> using vector1 = vector<T>;
S<vector1> s;
Run Code Online (Sandbox Code Playgroud)
所以我的结论是,不要让事情变得多变.实际上你并没有获得灵活性,只是减少了用户必须编写的代码量,但代价是可读性较差.
归档时间: |
|
查看次数: |
230 次 |
最近记录: |