如何专门定义在可变参数模板类中定义的可变参数方法?

问题描述

我有一个可变参数模板类,它包含一个带有可变参数参数的方法。 我想根据类的专门版本提供的一些参数来专门化该方法

我知道如何特化可变参数函数以及如何执行模板特化。不幸的是,我没有设法同时使用这两种专业。

我当前的解决方案似乎覆盖了不是我想要的解决方案。 下面是简化的问题

    #include <iostream>

struct X;
struct Y;

template<typename ... FooTs>
struct Foo
{
public:

  template < typename... Ts >
  static int value(Ts... args){ return 0;};

};

template <>
struct Foo<X,Y>{
    static int value(int& a,int& b,float& c)
    {
        std::cout << "specialized value 3 args..." << std::endl;
        return 0;
    }
};

/* Ideally I would also like to have such specialization
template <>
struct Foo<X,Y>{
    int value(int a,int b)
    {
        std::cout << "specialized value 2 args..." << std::endl;
        return 0;
    }
};*/

int main(){
    Foo<X,Y> foo;
    int a = 1;
    int b = 2;
    float c = 3.4;
    Foo<X,Y>::value(a,b,c);
    foo.value(a,c);
    // foo.value(a,b);  // error: no matching function for call to 'Foo<X,Y>::value(int&,int&)
    return 0;
}

如何实现上面例子中“value”方法的特化?

解决方法

只能有一个 Foo<X,Y> 类型。

因此,您不能根据 Foo 函数之一的模板参数专门化它本身。想一想:如果 Foo 内部有多个模板化函数会发生什么?

但是,您可以通过重载函数本身而不是类型来创建函数的专用版本:

template<>
template<>
int Foo<X,Y>::value(int a,int b) {
    return 12;
}

int test() {
    return Foo<X,Y>::value(1,2);
}
,

这与模板或专业化无关。其实很简单:

template <>
struct Foo<X,Y>{
    static int value(int& a,int& b,float& c)
    {
        std::cout << "specialized value 3 args..." << std::endl;
        return 0;
    }
    int value(int a,int b)
    {
        std::cout << "specialized value 2 args..." << std::endl;
        return 0;
    }
};

Demo