新しい概念の構文を使用して、自分用に簡単な例を作成しようとしています。型に operator() が定義されているかどうかをテストすることにし、SFINAE パラダイムを使用してこれをテストするための構造体を作成しましたが、型の問題が発生しています。これが私のコードです:
#include <utility>
#include <functional>
namespace Templates::Concepts {
template<class type__>
struct call_check {
template<class type_ = type__>
static auto check(std::nullptr_t) -> decltype(std::declval<type_>().operator()(), std::false_type(), std::true_type());
template<class type_ = type__>
static auto check(...) -> decltype(std::false_type());
template<class type_ = type__>
using type = decltype(check<type_>(nullptr));
};
template<typename type_>
concept bool Callable = []() -> bool { typename call_check<type_>::type *t; return *t;};
}
「typename」ポインターなしで開始しましたが、
return call_check<type_>::type;
、
しかし、名前依存の型エラーを受け取りました。タイプ名を追加した後、私は今受け取ります
concepts.h:20:78: error: ‘typename Templates::Concepts::call_check<yes>::type’ names ‘template<class type_> using type = decltype (check<type_>(nullptr))’, which is not a type
、
そして私は立ち往生しています。率直に言って、この SFINAE チェックを実装する最も正しい方法を完全には理解していないため、どこから始めればよいかわかりません。パラダイムおよび/または概念に関するヘルプもいただければ幸いです。
次のような例を見ました
std::declval<type_>()(std::declval<other>(), std::declval<op>()), ...
最初のチェック (二項演算子の場合) の decltype 呼び出しの最初の項目を置き換えましたが、それが関数呼び出しにどのように変換されるかを理解するのに苦労しました。(参考までに、上から3番目の回答:operator== が存在するかどうかを確認するには?)。