簡體   English   中英

如何在模板化 class 中使用“std::enable_if_t”,而不引入第二個模板參數

[英]How to use 'std::enable_if_t' inside templated class, without introducing second template argument

我有一個矢量包裝器的 100% 工作代碼,它為各種類型的矢量調整大小不同。 但是,在定義 std::enable_if_t 時,我使用

template <typename C = Vec> 

而不是直接使用“Vec”。 有沒有辦法為 resizeListTo() 方法重用 class 的模板參數“Vec”?

完整代碼:

template <class Vec>
class MyVectorWrapeer<Vec> {
 private:
  template <typename C = Vec>
  std::enable_if_t<someCondition<C, typename C::value_type>, void>
  static inline resizeListTo(C& c, uint32_t size) { /*Some Code*/ }
  template <typename C = Vec>
  std::enable_if_t<!someCondition<C, typename C::value_type>, void>
  static inline resizeListTo(C& c, uint32_t size) { /*Different Code*/ }

 public:
  static void deserializeVector(Vec* dst) {
    ...
    resizeListTo(*dst, size);
    ...
  }

我的意思是,像

  template <>
  std::enable_if_t<someCondition<Vec, typename Vec::value_type>, void>
  static inline resizeListTo(Vec& c, uint32_t size) {

(上面的代碼顯然不能編譯)

在 C++20 中,您requires為方法添加約束:

template <class Vec>
class MyVectorWrapeer<Vec>
{
private:
  static void resizeListTo(Vec& c, uint32_t size) requires(someCondition<Vec>)
  { /*Some Code*/ }
  static void resizeListTo(Vec& c, uint32_t size) requires(!someCondition<Vec>)
  { /*Different Code*/ }
};

從您的示例中,您需要不同的實現,因此標記調度:

template <class Vec>
class MyVectorWrapeer<Vec>
{
private:
  static void resizeListTo_impl(Vec& c, uint32_t size, std::true_type) { /*Some Code*/ }
  static void resizeListTo_impl(Vec& c, uint32_t size, std::false_type) { /*Different Code*/ }

  static void resizeListTo(Vec& c, uint32_t size)
  {
    resizeListTo_impl(c, size, std::bool_constant<someCondition<Vec>>{});
  }
};

或者從 C++17 開始, if constexpr (如果兩個分支都可編譯,則常規if甚至可以在 c++17 之前完成工作):

template <class Vec>
class MyVectorWrapeer<Vec>
{
private:
  static void resizeListTo(Vec& c, uint32_t size)
  {
    if constexpr (someCondition<Vec>) {
       /*Some Code*/
    } else {
       /*Different Code*/
    }
  }
};

暫無
暫無

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

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