1

我会直接回答这个问题。

我们有模板专业化:


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。如何在不向类添加新功能的情况下做到这一点?

在此先感谢您的帮助!

祝你今天过得愉快!

4

1 回答 1

0

在你的第一个例子中

template<>
int TestClass::fn(const int& a)
{ /* ... */ }

你有一个完整的专业化,这对于 C++ 模板函数/方法是允许的

但是,鉴于声明

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++ 函数/方法是不允许的。

但是您可以使用重载,完全避免专门化,为具有相同名称的不同模板方法添加声明。

我是说

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)
 { /* ... */ }
于 2020-12-03T14:50:38.063 回答