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

时间:2013-09-30 12:30:17

标签: c++ templates stdvector

我想创建一个以std :: vector引用作为参数的类方法,我希望将它与不同类型的数据一起使用。

该功能应如下所示:

void some_function(const std::vector & vect){ //do something with vector }

我想用它来举例如:

std::vector<int> v1;
some_function(v1);
std::vector<string> v2;
some_function(v2);

我希望我明白我的观点。 我是否必须制作这样的模板方法:

template<class T>
void some_function(std::vector<T> & vect){}

或者我可以用其他方式吗?如果必须,请告诉我如何在课堂上编写该方法。

感谢您的帮助!

1 个答案:

答案 0 :(得分:30)

template函数通过std::vector接受任何const&的正确方法是:

template<typename T, typename A>
void some_func( std::vector<T,A> const& vec ) {
}

第二个参数是&#34; allocator&#34;,在std::vector的某些高级用法中,它不是默认值。如果您接受std::vector<T>,则some_func会拒绝使用其他分配器std::vector

现在,还有其他方法可以解决这个问题,我会快速列出来。我将列出它们降低成本:效益比 - 上面的那个可能是你想要的,下一个有时是有用的,之后我将分支到很少值得考虑的过度工程案例(但可能有用)在一些角落里)。

您可以T接受任意类型T&&,然后进行测试以确定typename std::remove_reference<T>::type是否是std::vector的一种。这样你就可以完成转发&#34;传入的std::vector。它还允许您更改用于测试的谓词,以便接受的不只是std::vector:在大多数情况下,const&std::vector可能只需要一些任意的随机访问容器。

一种荒谬的幻想方式是做两步功能。对于具有SFINAE的固定类型T,第二步采用类型擦除的随机访问范围视图(或者只是范围视图,如果您不需要随机访问)以确保传入对象兼容,第一步推断传入类型的容器类型,并调用SFINAE上下文中的第二步(auto some_func(...)->decltype(...))。

由于std::vector<T> const&对连续T的随机访问范围视图的类型擦除并没有失去太多功能,所以优势在于您可以保证功能正文std::vector<T> const&以及T[n]std::array<T,n>完全相同。

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

可能会让这更容易,因为上面的多步SFINAE会崩溃成几个必需条款。

相关问题