问:带有参数包的模板特化
Q: Template specialization with parameter pack
我马上进入正题。
我们有模板专业化:
class TestClass
{
public:
template<typename T>
static T fn(const T& a);
}
// OK
template<typename T>
T TestClass::fn(const T& a)
{
// ... magic for any type here ...
}
// OK
template<>
int TestClass::fn(const int& a)
{
// ... magic for int type here ...
}
一切顺利。但是如果我想给函数加一个参数包呢?
class TestClass
{
public:
template<typename T, typename... Args>
static T fn(const T& a, Args&& ...b);
}
// OK
template<typename T, typename... Args>
T TestClass::fn(const T& a, Args&& ...b)
{
// ... magic for any type here ...
}
// Error
template<typename... Args>
int TestClass::fn(const int& a, Args&& ...b)
{
// ... magic for int type here ...
}
Visual Studio 给出错误 E0147。
如何在不向 class 添加新函数的情况下做到这一点 ?
在此先感谢您的帮助!
祝你有愉快的一天!
在你的第一个例子中
template<>
int TestClass::fn(const int& a)
{ /* ... */ }
你有一个完全专业化,这是 C++ 模板允许的functions/methods
但是,根据声明
template<typename T, typename... Args>
static T fn(const T& a, Args&& ...b);
你的第二个例子
template<typename... Args>
int TestClass::fn(const int& a, Args&& ...b)
{ /* ... */ }
成为 部分专业化,这是 C++ 所不允许的 functions/methods。
但是您可以使用重载,完全避免特化,为具有相同名称的不同模板方法添加声明。
我是说
class TestClass
{
public:
template <typename T, typename ... Args>
static T fn (T const & a, Args && ... b);
template <typename ... Args>
static T fn (int const & a, Args && ... b);
};
template <typename T, typename ... Args>
T TestClass::fn (T const & a, Args && ... b)
{ /* ... */ }
template <typename ... Args>
int TestClass::fn (int const & a, Args && ... b)
{ /* ... */ }
我马上进入正题。
我们有模板专业化:
class TestClass
{
public:
template<typename T>
static T fn(const T& a);
}
// OK
template<typename T>
T TestClass::fn(const T& a)
{
// ... magic for any type here ...
}
// OK
template<>
int TestClass::fn(const int& a)
{
// ... magic for int type here ...
}
一切顺利。但是如果我想给函数加一个参数包呢?
class TestClass
{
public:
template<typename T, typename... Args>
static T fn(const T& a, Args&& ...b);
}
// OK
template<typename T, typename... Args>
T TestClass::fn(const T& a, Args&& ...b)
{
// ... magic for any type here ...
}
// Error
template<typename... Args>
int TestClass::fn(const int& a, Args&& ...b)
{
// ... magic for int type here ...
}
Visual Studio 给出错误 E0147。 如何在不向 class 添加新函数的情况下做到这一点 ?
在此先感谢您的帮助!
祝你有愉快的一天!
在你的第一个例子中
template<>
int TestClass::fn(const int& a)
{ /* ... */ }
你有一个完全专业化,这是 C++ 模板允许的functions/methods
但是,根据声明
template<typename T, typename... Args>
static T fn(const T& a, Args&& ...b);
你的第二个例子
template<typename... Args>
int TestClass::fn(const int& a, Args&& ...b)
{ /* ... */ }
成为 部分专业化,这是 C++ 所不允许的 functions/methods。
但是您可以使用重载,完全避免特化,为具有相同名称的不同模板方法添加声明。
我是说
class TestClass
{
public:
template <typename T, typename ... Args>
static T fn (T const & a, Args && ... b);
template <typename ... Args>
static T fn (int const & a, Args && ... b);
};
template <typename T, typename ... Args>
T TestClass::fn (T const & a, Args && ... b)
{ /* ... */ }
template <typename ... Args>
int TestClass::fn (int const & a, Args && ... b)
{ /* ... */ }