【问题标题】:How to accept both std::vector and std::initializer_list如何同时接受 std::vector 和 std::initializer_list
【发布时间】:2018-09-23 08:42:55
【问题描述】:

我有

void f(std::initializer_list<int> x);
// .cpp
void f(std::initializer_list<int> x) { /* Lots of code */ }

有时我也需要

inline void f(std::vector<int> x) { /* I want call f(initializer_list), but cant */; }

我的解决方案

void f_inner(const int* x, std::size_t size);
inline void f(std::initializer_list<int> x) { f_inner(x.begin(), x.size(); } 
inline void f(std::vector<int> x) { f_inner(x.data(), x.size()); }
// .cpp
void f_inner(const int* x, std::size_t size) { /* Lots of code */ }

也许有更优雅的解决方案?但我不想将 f_inner 移动到 .h 并使其成为模板

【问题讨论】:

  • 你真的不需要std::initializer_list 重载。只需坚持使用const std::vector&lt;int&gt;&amp;,它将涵盖您的用例。如果您想选择不使用std::initializer_list 动态分配,那么您的解决方案很好。
  • 是的,你是对的。我没想到:)
  • 您不喜欢您的解决方案的哪些方面?如果有的话,我会将f_inner 移至 .cpp - 但否则它会满足您的需求,对吧?

标签: c++ c++17


【解决方案1】:

使用像 gsl span 这样的类型。

向量和初始化器列表都是连续的容器,一个到 const 数据的 span 可以以零成本包装。

因此,您可以将其组合在一起,彻底解决您的问题。 GSL span 本身会阻止它进行错误的尝试,以保护自己免受使用 ils 构建的悬空局部 span 的侵害。

【讨论】:

猜你喜欢
  • 2012-07-09
  • 2014-08-20
  • 2014-11-19
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多