前提
C++20 のConceptを使ってC++17コードの書換え作業をしています。
コンセプトを定義して,パラメータパックを使ったテンプレート関数に対して制約を加える書き方には,いくつかありますが,requires を使うと期待した動作をするのに,template<>の typename に代えて制約を書くと期待した動作をしません。
具体的には以下のコードです。
問題点がわかる方のご教示いただければ幸いです。
実現したいこと
もちろん,
template< C ...Args>
void foo(){}
と書くことです。
発生している問題・エラーメッセージ
No matching function for call to 'foo'
該当のソースコード
C++
1/// シーケンス中の要素の一つでもtrueがあるとtrueを返す定数式 2constexpr bool Some(){return false;} 3template<typename ...Args> 4constexpr bool Some(bool b, Args ...args) 5{ 6 return b || Some(args...); 7} 8/// シーケンス中の要素に一つでもfloatがあることを要件とする制約式 9template<typename ...Args> 10concept C = Some( same_as<Args,float>...); 11 12///requiresを使ってboo関数を作ってみる 13template<typename ...Args> 14requires C<Args...> 15void boo(Args... args){} 16 17///typenameに制約式を使ってfoo関数を作ってみる 18template<C ...Args> 19void foo(Args... args){} 20 21int main(){ 22 static_assert(C<float,char,char>); 23 boo(3.5f, 3, 5); 24 foo(3.5f, 3, 5);///なぜかこっちはエラー 25}
試したこと
SomeをAllに変えてみるとうまくいく。
C++
1//シーケンス中の要素が全てtrueのときにtrueを返す定数式 2constexpr bool All(){return true;} 3template<typename ...Args> 4constexpr bool All(bool b, Args ...args) 5{ 6 return b && All(args...); 7}
補足情報(FW/ツールのバージョンなど)
C++20 clang
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/30 05:10
2022/03/30 05:36
2022/03/30 23:03