У меня есть шаблонный класс 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;
}
Я искал его весь день, но ничего
calc
с некоторыми конкретными типами параметров, но это все. - person HolyBlackCat   schedule 17.07.2020