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 が発生します。クラスに新しい関数を追加せずにこれを行うにはどうすればよいですか?

よろしくお願いします。

良い1日を!

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);

あなたの2番目の例

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 に答える