如何部分专门化可变参数模板函数

时间:2015-02-16 22:42:49

标签: c++ templates c++11 variadic-templates

我试图将我的可变参数模板专门化,因为他的第一个类型是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);
}

1 个答案:

答案 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,带有一些调试打印,表明正在调用正确的函数。