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

最佳答案

只需为使用applyfunction<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/

10-12 19:28