Search code examples
c++templatesc++-concepts

How to declare concept function signature with a template type?


Is there a way to have a concept function signature that has a template argument?

Something like this:

template<typename SomeTypeT, typename U>
concept SomeType = requires(SomeTypeT s) {
    { s.SomeFunction<U>() };
};

?


Solution

  • The shown concept definition works, except that you need to tell the compiler that SomeFunction is a template:

    template<typename SomeTypeT, typename U>
    concept SomeType = requires(SomeTypeT s) {
        { s.template SomeFunction<U>() };
    };
    

    This is always necessary if you want to reference a template member of a dependent name in a template definition, not specific to concepts. When parsing the definition, the compiler doesn't know yet what type s is and so can't know that SomeFunction is supposed to be a template. But it needs to know, since the meaning of the angle brackets and the whole expression can dependent on it.