繁体   English   中英

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

[英]std::vector as a template function argument

我想创建一个类方法,它将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){}

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

感谢帮助!

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

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

第二个参数是“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& to std::vector可能只需要一些任意的随机访问容器。

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

由于std::vector<T> const&类型擦除以及连续T s的随机访问范围视图不会失去太多功能,因此可以保证函数体对于std::vector<T> const&完全相同std::vector<T> const&T[n]以及std::array<T,n>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM