【问题标题】:std::vector as a template function argumentstd::vector 作为模板函数参数
【发布时间】:2013-09-30 12:30:16
【问题描述】:

我想创建一个将 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){}

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

感谢您的帮助!

【问题讨论】:

  • 是的,就是这样做的。还是你在问别的?
  • 你的建议有什么问题?
  • 这个问题的答案是自给自足的。只是补充一点,如果有人想迭代这样的向量,请使用:for(typename vector&lt;T, A&gt;::const_iterator it = vect.begin(); it != vect.end(); ++it)

标签: c++ templates stdvector


【解决方案1】:

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

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

第二个参数是“分配器”,在std::vector 的一些高级用法中,它不是默认的。如果您只接受std::vector&lt;T&gt;,您的some_func 将拒绝带有备用分配器的std::vectors。

现在,还有其他方法可以解决这个问题,我将快速列出。我将按成本效益比递减的方式列出它们——上面的一个可能是你想要的,下一个有时是有用的,然后我将分支到很少值得考虑的过度设计的案例(但可能有用在某些极端情况下)。

您可以通过T&amp;&amp; 接受任意类型T,然后测试以确定typename std::remove_reference&lt;T&gt;::type 是否是std::vector 的一种。这将允许您对传入的std::vector 进行“完美转发”。它还可以让您更改用于测试的谓词,使其不仅仅接受 std::vector:在大多数情况下,const&amp;std::vector 可能只需要一些任意的随机访问容器。

一个可笑的奇特方法是执行两步功能。第二步为带有 SFINAE 的固定类型T 采用类型擦除的随机访问范围视图(如果不需要随机访问,则只使用范围视图)以确保传入对象兼容,第一步推断传入类型的容器类型,并在 SFINAE 上下文 (auto some_func(...)-&gt;decltype(...)) 中调用第二步。

由于将std::vector&lt;T&gt; const&amp; 类型擦除到连续Ts 的随机访问范围视图不会失去太多功能,因此您可以保证函数的主体与@ 完全相同987654342@ 和 T[n]std::array&lt;T,n&gt;

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

可能会使这更容易,因为上面的多步骤 SFINAE 将折叠成几个 requires 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多