Как использовать концепции C ++ 20 для сопоставления универсальной функции-члена класса

У меня есть шаблонный класс Foo, включая универсальную функцию calc, которая может принимать любые ARGS

template <class RET>
struct Foo
{
    template<class ...ARGS>
    RET calc(ARGS &&...args)
    {
        // do some thing...
        ((std::cout<<", "<<std::forward<ARGS>(args)), ...) <<std::endl;
        return defaultRet;
    }

    RET defaultRet;
};

int main () {
    auto ret = Foo<int>(42).calc(1,2,3); // print "1, 2, 3"
    std::cout<< ret <<std::endl;        // print "42"
    return 0;
}

Затем я хочу написать концепцию Calcable для соответствия Foo. И Bar::calc вернет void, поэтому Calcable<Bar<int>> должно быть false

Но я не могу написать Calcable, я сумасшедший!

template <class RET>
struct Foo
{
    template<class ...ARGS>
    RET calc(ARGS &&...args)
    {
        // do some thing...
        ((std::cout<<", "<<std::forward<ARGS>(args)), ...) <<std::endl;
        return defaultRet;
    }

    RET defaultRet;
};

template <class RET>
struct Bar
{
    
};

template <class T>
concept Calcable = ??  // <<<<<<<<<<<< How to match generics function calc?

template <Calcable T>
struct Check
{

};

int main () {
    auto ret = Foo<int>(3).calc(1,2,3);  // ok
    std::cout<< ret <<std::endl;         // ok

    using YES = Check<Foo<int>>;         // I need compile pass
    using NO = Check<Bar<int>>;          // I need compile error
    return 0;
}

Я искал его весь день, но ничего


person yuriarthas    schedule 17.07.2020    source источник
comment
Итак, вы хотите проверить возвращаемый тип для всех возможных типов параметров? Я не думаю, что ты сможешь это сделать.   -  person HolyBlackCat    schedule 17.07.2020
comment
Хорошо, я удалил Bar :: calc. теперь я просто хочу проверить тип, у которого есть универсальный calc ()   -  person yuriarthas    schedule 17.07.2020
comment
Тем не менее, вы мало что можете сделать. Вы можете проверить, можно ли вызвать calc с некоторыми конкретными типами параметров, но это все.   -  person HolyBlackCat    schedule 17.07.2020