std :: vector作为模板函数参数

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::vectorconst&是:

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>.

这不是一个很大的优势,特别是对于所需的样板.

可以使这更容易,因为上面的多步SFINAE将崩溃成几个require子句.