我正在尝试将我的可变参数模板专门化,因为他的第一个类型是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);
}
最佳答案
只需为使用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,以表明正在调用正确的函数。
关于c++ - 如何部分专门化可变参数模板功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28551664/