问:带有参数包的模板特化

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)
 { /* ... */ }