如何专门化在可变参数模板 class 中定义的可变参数方法?
How to specialized a variadic argument method defined inside a variadic templated class?
我有一个可变参数模板 class,其中包含一个带有可变参数的方法。
我想根据 class.
的专用版本提供的一些参数来专门化该方法
我知道如何特化可变参数函数以及如何执行模板特化。不幸的是,我没有设法同时使用这两个专业。
我当前的解决方案似乎覆盖了不是我想要的解决方案。
下面是简化的问题
#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, b, c);
// foo.value(a, b); // error: no matching function for call to 'Foo<X, Y>::value(int&, int&)
return 0;
}
如何实现上述示例中“值”方法的特化?
只能有一个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;
}
};
我有一个可变参数模板 class,其中包含一个带有可变参数的方法。 我想根据 class.
的专用版本提供的一些参数来专门化该方法我知道如何特化可变参数函数以及如何执行模板特化。不幸的是,我没有设法同时使用这两个专业。
我当前的解决方案似乎覆盖了不是我想要的解决方案。 下面是简化的问题
#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, b, c);
// foo.value(a, b); // error: no matching function for call to 'Foo<X, Y>::value(int&, int&)
return 0;
}
如何实现上述示例中“值”方法的特化?
只能有一个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;
}
};