可变模板模板参数语法
variadic template template parameter syntax
我有这个模板函数(我记得在SO的某个地方看到类似的东西)。它适用于std::function
和std::list
(作为Container
)。但是我不能真正理解template <typename, typename...> class Container
的语法。<
中的>
似乎是一种不同的语言(与C/旧c++相比)。有人能解释一下或者给出一个好的参考来解释这个吗?
template <typename T, template <typename, typename...> class Container>
static bool contained(const T & x, const Container<T> & xs) {
return std::find(xs.begin(),xs.end(),x) != xs.end();
}
template <typename T, template <typename, typename...> class Container>
上面表明Container
是一个模板模板形参,这意味着传递给函数模板的Container
类型本身必须是一个至少接受一个模板实参的模板——第二个模板实参之后将被参数包(typename...
)使用。
但是你的函数模板有一个问题。正如我所解释的,您指出Container
必须是接受一个或多个模板实参的类模板,但是相应的函数形参(xs
)表明它接受单个模板实参。之所以对std::list
、std::vector
或std::deque
有效,是因为它们各自的第二个模板参数,分配器类型,有一个默认值(std::allocator<T>
)。如果这些容器具有非默认的分配器类型,那么函数模板将无法与它们一起工作。
为了解决这个问题,xs
的类型也需要容纳额外的模板参数。
template <typename T, typename... Params,
template <typename, typename...> class Container>
static bool contained(const T & x, const Container<T, Params...> & xs) {
return std::find(xs.begin(),xs.end(),x) != xs.end();
}
然而,这个特殊的问题可以在不使用模板模板参数的情况下解决。只要接受任何类型的
Container
,而不是将其作为模板进行规定。您正在搜索的元素的类型可以通过使用Container::value_type
嵌套类型来指定,该类型是标准库中所有容器定义的。
template <typename Container>
static bool contained(typename Container::value_type const& x,
const Container& xs) {
return std::find(xs.begin(),xs.end(),x) != xs.end();
}
此外,c++ 11添加了std::any_of
,它的功能与contained()
相同。
相关文章:
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 当C++类函数参数之一是结构时,它们的语法有什么不同
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 提升::精神::qi::语法和可变参数模板
- C++ 中的默认参数语法和一般语法
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- C++ C 样式数组作为语法错误的参数
- 使用 MATLAB 语法的 c++ 函数参数?
- 在模板类中的参数包的语法
- 将QMETAMETHOD作为参数传递到使用新的Qobject :: Connect语法的函数
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 是否可以在尾随返回类型语法中直接使用参数值(不是其类型,而是值本身)
- 精神语法不会编译:函数模板参数错误?
- 适用于全局模板运算符指定模板参数的适当语法
- hpp文件中的块,这是c ++语法吗?为什么没有传入参数?有人可以解释一下,请
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 使用仅语法参数切换警告
- 版本80语法-参数列表中的初始化