Pre*_*eek 18 c++ templates stdvector
我想创建一个类方法,它将std :: vector引用作为参数,我想将它与不同类型的数据一起使用.
该函数应如下所示:
void some_function(const std::vector & vect){ //do something with vector }
Run Code Online (Sandbox Code Playgroud)
我想用它来举例如:
std::vector<int> v1;
some_function(v1);
std::vector<string> v2;
some_function(v2);
Run Code Online (Sandbox Code Playgroud)
我希望我明白我的观点.我是否必须制作这样的模板方法:
template<class T>
void some_function(std::vector<T> & vect){}
Run Code Online (Sandbox Code Playgroud)
或者我可以用另一种方式吗?如果必须,请告诉我如何在课堂上编写该方法.
感谢帮助!
Yak*_*ont 31
一个正确的方法template函数接受任何std::vector的const&是:
template<typename T, typename A>
void some_func( std::vector<T,A> const& vec ) {
}
Run Code Online (Sandbox Code Playgroud)
第二个参数是"allocator",在某些高级用法中std::vector它不是默认值.如果您只是接受std::vector<T>,您some_func将拒绝std::vector使用其他分配器.
现在,还有其他方法可以快速列出.我将列出它们降低成本:效益比 - 上面的那个可能是你想要的,下一个有时是有用的,之后我将分支到很少值得考虑的过度工程案例(但可能有用)在一些角落的情况下).
您可以T通过T&&测试接受任意类型以确定是否typename std::remove_reference<T>::type是一种类型std::vector.这将允许您对传入进行"完美转发" std::vector.这也将让你改变你用它来测试接受超过谓词仅仅是std::vector:在大多数情况下,const&以std::vector可能只是需要一些任意的随机访问容器.
一种荒谬的幻想方式是做两步功能.对于T使用SFINAE 的固定类型,第二步采用类型擦除的随机访问范围视图(或者只是范围视图,如果您不需要随机访问)以确保传入对象兼容,第一步推断容器传入类型的类型,并调用SFINAE上下文中的第二步(auto some_func(...)->decltype(...)).
作为类型擦除std::vector<T> const&,以连续的随机存取远程视图Ts不失去太多的功能,一个好处是,你能保证你的函数体是完全为同std::vector<T> const&和T[n]和std::array<T,n>.
这不是一个很大的优势,特别是对于所需的样板.
c ++ 20可以使这更容易,因为上面的多步SFINAE将崩溃成几个require子句.