c++ 模板类;具有任意容器类型的函数,如何定义它?

c++ template class; function with arbitrary container type, how to define it?(c++ 模板类;具有任意容器类型的函数,如何定义它?)
本文介绍了c++ 模板类;具有任意容器类型的函数,如何定义它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

好的,简单的模板问题.假设我像这样定义我的模板类:

template类 foo {上市:foo(T const& first, T const& second) : first(first), second(second) {}模板void bar(C& 容器,T const& baz){//...}私人的:第一;T秒;}

问题是关于我的 bar 函数...我需要它能够使用某种标准容器,这就是为什么我包含模板/类型名称 C 部分来定义该容器类型.但显然这不是正确的方法,因为我的测试班然后抱怨:

错误:'bar' 未在此范围内声明

那么我将如何以正确的方式实现我的栏功能?也就是说,作为我的模板类的一个函数,具有任意容器类型......我的模板类的其余部分工作正常(具有不会导致错误的其他函数),这只是一个有问题的函数.

好的,所以特定函数(bar)是一个 eraseInRange 函数,它擦除指定范围内的所有元素:

void eraseInRange(C& container, T const& firstElement, T const& secondElement) {...}

一个如何使用它的例子是:

eraseInRange(v, 7, 19);

在这种情况下,v 是一个向量.

编辑 2:傻我!我应该在我的班级之外声明这个函数,而不是在里面……这是一个非常令人沮丧的错误.无论如何,感谢大家的帮助,虽然问题有点不同,但这些信息确实帮助我构建了函数,因为在找到我原来的问题后,我确实遇到了其他一些令人愉快的错误.所以谢谢你!

解决方案


特征解决方案.

概括不要超过需要,不要少于.

在某些情况下,该解决方案可能还不够,因为它会匹配具有此类签名的任何模板(例如 shared_ptr),在这种情况下,您可以使用 type_traits,非常像 duck-typing(模板通常是鸭式的).

#include //Helper 判断是否有一个用于 T 的 const_iterator.模板结构 has_const_iterator{私人的:模板静态字符测试(类型名 C::const_iterator*);模板静态整数测试(...);上市:枚举 { value = sizeof(test(0)) == sizeof(char) };};//bar() 是为也定义了 const_iterator 的容器定义的//作为 value_type.模板 typename std::enable_if::value,无效>::类型bar(const Container &c, typename Container::value_type const & t){//注意:不需要对 value_type 进行额外检查,检查是为了//已经在函数签名中释放了.}模板 类DoesNotHaveConstIterator {};#include <向量>int主(){std::vectorC;酒吧 (c, 1.2f);DoesNotHaveConstIterator乙;酒吧 (b, 1.2f);//正确编译失败}

一个好的模板通常不会人为地限制它们有效的类型(为什么要?).但是想象一下,在上面的示例中,您需要访问对象 const_iterator,然后您可以使用 SFINAE 和 type_traits 将这些约束放在您的函数上.


或者只是像标准库那样

概括不要超过需要,不要少于.

template void bar (Iter it, Iter end) {for (; it!=end; ++it) {/*...*
                
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)