簡體   English   中英

如何使用 std::enable_if 元函數實現類模板函數?

[英]How can I implement a class template function with a std::enable_if metafunction?

我在我的類模板中使用了std::enable_if元函數來指定它只允許為具有GameCard作為基類的變量生成類。 當我實現內聯函數時,這本身就很好用。 但是,如果我想在標頭正文之外實現模板函數,我會遇到無法弄清楚如何正確指定要實現的函數的問題。

縮減示例代碼:

#include <string>
#include <memory>
#include <vector>

struct GameCard {};

template<class T, class = std::enable_if_t<std::is_base_of<GameCard, T>::value>>
struct CardStack {
  std::vector<T> cards;
  bool Test();
};

我的 IDE 將其生成為函數規范:

template<class T, class>
bool CardStack<T, <unnamed>>::Test() {
  return false;
}

這顯然是錯誤的,因為我收到編譯器錯誤。 但我不知道如何正確地做到這一點。 你們中有人知道如何正確地做到這一點嗎?

類外定義應該是:

template<class T, class Enabler>
bool CardStack<T, Enabler>::Test() {
  return false;
}

但目前,你的班級可能會被劫持:

CardStack<int>CardStack<int, void>由於 SFINAE 無法編譯,

CardStack<int, char>將是“有效的” (由於CardStack實現中int產生的硬錯誤而導致無法編譯的風險)。

static_assert在你的情況下似乎足夠了:

template<class T>
struct CardStack {
  static_assert(std::is_base_of<GameCard, T>::value);

  std::vector<T> cards;
  bool Test();
};

使用更簡單的類定義:

template<class T>
bool CardStack<T>::Test() {
  return false;
}

函數成員定義應該是這樣的:

template <class T, class U>
bool CardStack<T, U>::Test() {
    // body of function
}

活生生的例子


解釋非常簡單,這里沒有魔法。 只需遵循C++的正常語法規則即可。

你的類的定義是一個帶有兩個模板參數的模板類:

template<class, class>
struct CardStack { /* ... */ };

T是第一個的名字。 另一方面,第二個沒有任何類型名稱,只有一個默認類型( = ... )。 默認類型(類似於函數的默認參數)不必在定義中指定。

因此,每個方法的定義應采用以下形式:

template <class T, class U>
bool CardStack<T, U>::MethodName() {}

暫無
暫無

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

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