我有一个功能
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()等于?
答案 0 :(得分:6)
没有。好吧,你可以做二进制搜索或查找表,但这仍然会生成O(max size_t ^ 2)代码。
很少有系统允许生成大量代码并且不会造成可怕的死亡:在64位计算机上,我们仅在函数名称长度上以10 ^ 37的顺序进行讨论。如果您将当前行星地球的副本放在整个可见宇宙中的每颗恒星周围并使用地球计算机存储中的每一个来存储您的功能名称列表,那么存储所有这些函数名称是切实可行的。
你可能会遇到编译器限制,但是我没有尝试过icpc。
如果您选择较小的限制(例如,1000),您可以更实际地做到这一点。使用相对较小的上限,我称之为magic switch(将运行时值调度为编译时常量)解决了这个问题。
然而,问题在于你的计划。