簡體   English   中英

問:帶有參數包的模板特化

[英]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 ...
}

一切都好。 但是,如果我想在 function 中添加參數包怎么辦?

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 添加新的 function ,我該如何做到這一點?

在此先感謝您的幫助!

祝你今天過得愉快!

在你的第一個例子中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM