簡體   English   中英

如何應用使默認構造函數有條件地顯式?

[英]How can I apply make a default constructor conditionally explicit?

問題

假設我們有一個(虛構的)類模板C<T>帶有條件顯式默認構造函數。 當且僅當std::is_same_v<T, int>默認構造函數應該是顯式的。

對“[c++] 條件顯式”的搜索返回以下結果: 構造函數有條件地標記為顯式

失敗的解決方案

接受的答案給出了一個例子:

 struct S { template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = false > S(T) {} template <typename T, typename std::enable_if<!std::is_integral<T>::value, bool>::type = false> explicit S(T) {} };

稍微修改示例給出了使用熟悉的std::enable_if方法的實現:

template <class T>
class C {
public:
  template <std::enable_if_t<std::is_same_v<T, int>, int> = 0>
  C() {}

  template <std::enable_if_t<!std::is_same_v<T, int>, int> = 0>
  explicit C() {}
};

不幸的是,這甚至不能編譯: demo

prog.cc: In instantiation of 'class C<int>':
prog.cc:15:10:   required from here
prog.cc:10:12: error: no type named 'type' in 'struct std::enable_if<false, int>'
   10 |   explicit C() {}
      |            ^
prog.cc: In instantiation of 'class C<double>':
prog.cc:18:13:   required from here
prog.cc:7:3: error: no type named 'type' in 'struct std::enable_if<false, int>'
    7 |   C() {}
      |   ^

問題似乎是由於省略了構造函數的模板參數,禁用了 SFINAE。

  1. 為什么這不能編譯?
  2. 什么是可能的實現?

如果可能,我想避免專門化該課程。

  1. 什么是可能的實現?

你有沒有試過

template <class T>
class C {
public: //  VVVVVVVVVVVVVV .................................V  U here, not T
  template <typename U = T, std::enable_if_t<std::is_same_v<U, int>, int> = 0>
  C() {}

  template <typename U = T, std::enable_if_t<!std::is_same_v<U, int>, int> = 0>
  explicit C() {}
};

?

  1. 為什么這不能編譯?

問題是 SFINAE 在類方法上使用方法本身的模板參數。

那是在原始工作代碼中:

  template <typename T,
             typename std::enable_if<std::is_integral<T>::value, bool>::type = false >
  S(T) {}

其中T是特定於構造函數的模板參數(從單個參數推導出來)。

相反,在你失敗的代碼中,

template <std::enable_if_t<std::is_same_v<T, int>, int> = 0>
C() {}

構造函數正在評估類( T )的模板參數,而不是方法。

使用技巧typename U = T ,您轉換T ,類的模板參數,在U ,方法的模板參數(在您的情況下是構造函數,但也適用於其他方法)所以std::enable_if_t ,與測試取決於U ,能夠啟用/禁用構造函數。

暫無
暫無

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

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