C++20 コンセプトで、特定の戻り値の型を持つメンバ関数を持つことを要求するにはどのようにすべきですか?

投稿者: Anonymous

A.f()はintを返していますが、もしコメントアウト部が入っているコードの場合は、boolでなければコンパイルエラーになります。これをコンセプトで要求したい(f()の戻り値をboolであることを要求したい)場合はどのようにすべきでしょうか?

#include <iostream>
#include <string>
#include <concepts>

struct A{
    int f()
    {
        return 42;
    }
};

template<class T>
concept Printable = requires(T t){
    t.f();
};

template<typename T>
void PrintIfPrintable(T arg)
{
    if constexpr (Printable<T>){
        //bool a {arg.f()}; // コンパイルエラー
        std::cout << arg.f() << std::endl;
    }
}

int main()
{
    PrintIfPrintable(A());
}

解決

std::same_asコンセプトを使用してt.f()の戻り値がboolか判定する感じでしょうか?

template<class T>
concept Printable = std::same_as<decltype(std::declval<T>().f()), bool>;
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *