【发布时间】:2018-05-31 05:26:30
【问题描述】:
我正在尝试使用参数包不是列表中的最后一个参数的可变参数模板函数。请注意,有两个递归调用 - 一个在包前面删除一个参数,另一个调用在包之后删除一个参数。
- 我的编译器似乎是:Apple LLVM 版本 8.1.0 (clang-802.0.42)
- 如果我能让它工作,下面所有的 int 都将是一个新的 T 模板参数。
如果 Blender 的调用站点不能干净,那么使用 ... 毫无意义。在这种情况下,我可以自己扩展 Blender 的几个重载。我真的不想诉诸于此。我希望我只是错过了一些东西。
int Blender( double t, int i)
{
return i;
}
template <typename ...Args>
int Blender( double t, int first, Args... more, int last)
{
return (1-t)*Blender(t, first, more...) + t*Blender(t, more..., last);
}
static void tryit()
{
Blender(.5, 23, 42, 89); //doesn't compile
}
【问题讨论】:
-
长话短说,这是不可能的。包在设计上是“贪婪”的。
-
可能能够做到这一点,就像在 C++ 中进行柯里化一样。扭曲是拉出最后一个参数并做任何你想做的特殊事情。 stackoverflow.com/questions/152005/…
-
这些数字是从哪里来的?只有在使用编译时常量时才有可能。
-
@Jodocus,实际上它们根本不是数字。它们是可以添加和乘以双精度(线性组合)的对象。并且这些值在编译时是未知的。
-
如果你打开它,你的 xcode 版本支持一些c++14 功能。如果你能做到,那将有所帮助;你能做到吗?
标签: c++ c++11 templates variadic-templates template-meta-programming