有没有理由使模板模板参数不可变?

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支持)?

Seb*_*edl 5

首先,文档.如果参数是可变参数,则用户现在需要检查一些其他源,以发现这确实需要一些需要一个模板参数的东西.

第二,提前检查.如果您不小心将两个参数传递给Tin 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)

所以我的结论是,不要让事情变得多变.实际上你并没有获得灵活性,只是减少了用户必须编写的代码量,但代价是可读性较差.