我试图将我的可变参数模板专门化,因为他的第一个类型是double
,但似乎并没有让它发挥作用。
我已经读过你不能部分专门化一个函数,至少在C ++ 03中没有,但我认为在一些较新版本的C ++中已经改变了。
#include <functional>
#include <iostream>
// end recursion if no more arguments
void apply(std::function<void()> f, int)
{
f();
}
template <typename Head, typename ...Tail>
void apply(std::function<void(Head, Tail...)> f, int i) {
auto g = [=](Tail&& ...args)
{
f(i, std::forward<Tail>(args)...);
};
apply(std::function<void(Tail...)>{g}, ++i);
}
// one of many failed attempts to specialize the template
template <typename Head, typename ...Tail>
void apply<double, Tail>(std::function<void(Head, Tail...)> f, int i)
{
auto g = [=](Tail&& ...args)
{
f(777.0, std::forward<Tail>(args)...);
};
apply(std::function<void(Tail...)>{g}, ++i);
}
void foo(int a, int b, double c, int d)
{
std::cout << a << b << c << d << std::endl;
}
int main()
{
auto f = std::function<void(int, int, double, int)>(foo);
apply(f, 0);
}
答案 0 :(得分:0)
只需为apply
function<void(double, Tail...)>
和int
添加一个重载,语法如下:
template <typename ...Tail>
void apply(std::function<void(double, Tail...)> f, int i)
{
auto g = [=](Tail&& ...args)
{
f(777.0, std::forward<Tail>(args)...);
};
apply(std::function<void(Tail...)>{g}, ++i);
}
这里有一个live working example,带有一些调试打印,表明正在调用正确的函数。