前提・実現したいこと
型特性関数とenable_if_tを使って,メンバ関数のオーバーロード解決はできるのですが,非型の場合にうまくいきません。具体的には,クラステンプレート仮引数の値によって,クラスメンバ関数のオーバーロード解決を行いたいというものです。次のコード例のように,型 T をenable_ifの条件にする場合は成功するのですが,size_tの場合には,エラーが出ます。
どこの点に問題があるのでしょうか。ご教示いただける方がおられれば教えてください。
発生している問題・エラーメッセージ
No type named 'type' in 'std::__1::enable_if<false, nullptr_t>'; 'enable_if' cannot be used to disable this declaration
該当のソースコード
C++
1using namespace std; 2template<size_t N> 3struct Foo{ 4 /* うまくいく例 5 template<typename T,enable_if_t<is_same_v<T,int>,std::nullptr_t> =nullptr> 6 array<T,1> 7 func(){array<T,1> a;return a;} 8 9 template<typename T,enable_if_t<!is_same_v<T,int>,std::nullptr_t> =nullptr> 10 array<T,N> 11 func(){array<T,N>a;return a;} 12 */ 13 14 template<typename T,enable_if_t<(N==1),std::nullptr_t> =nullptr> 15 array<T,1> 16 func(){array<T,1> a;return a;} 17 18 template<typename T,enable_if_t<(N>1),std::nullptr_t> =nullptr> 19 array<T,N> 20 func(){array<T,N>a;return a;} 21 22}; 23 24int main() 25{ 26 Foo<1> f; 27 28 array<int,1> ar = f.func<int>(); 29} 30
試したこと
上記の成功例のとおり。enable_if_tの第一引数はboolなのでTの比較の場合とNの比較の両者ともに真偽の判断という意味では同じだと思っています。
補足情報(FW/ツールのバージョンなど)
clang
C++17

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/19 03:33
2021/04/19 05:13
2021/04/19 07:07
2021/04/19 07:39