【问题标题】:Passing 0,1,2,...,N-1 as arguments to a function将 0,1,2,...,N-1 作为参数传递给函数
【发布时间】:2016-05-04 14:16:10
【问题描述】:

我有一个函数

template <typename T, typename... Args> void foo(const T&, Args...);

我想传递类似的东西:

foo(vector, 0,1,2,3,..., vector.size() - 1);

其中vector 是某种向量。我不能使用std::make_index_sequence,因为vector.size() 不是编译时常量。上述构造是否可行(例如,使用std::iota 作为助手),而不进行从 0 到无穷大的线性搜索来查找 vector.size() 等于什么?

【问题讨论】:

  • 也许我完全误解了这个问题(而且我几乎可以肯定我这样做了;),但是当传递vector 时传递vector,0,1,2,3...,vector.size()-1 有什么意义使得相同的信息可用于该函数?

标签: c++ function templates c++14 variadic-templates


【解决方案1】:

没有。好吧,您可以进行二分查找或查找表,但这仍会生成 O(max size_t^2) 代码。

很少有系统允许生成如此多的代码而不致于死去:在 64 位计算机上,我们仅在函数名长度上讨论 10^37 的数量级。如果您将当前地球的副本放置在整个可见宇宙中的每颗恒星周围,并使用地球上所有的计算机存储来存储您的函数名称列表,那么存储所有这些函数名称是可行的。

在能够做到这一点之前,您可能会遇到编译器限制,但我没有尝试过 icpc。

如果您选择较小的限制(例如 1000),您可以更实际地执行此操作。使用相对较小的上限,我称之为magic switch(将运行时值分配给编译时常量)解决了这个问题。

不过,问题出在你的计划上。

【讨论】:

  • 您将可能遇到编译器限制。爱它。 :-)
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2012-09-22
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多