Home > Back-end >  concepts template argument deduction
concepts template argument deduction

Time:05-16

The concept below has two template parameters but only one is specified during usage. Is T always deduced and InnerType always the parameter that needs explicit specification?

#include <iostream>
#include <string>
#include <span>

template < class T, class InnerType >
concept RangeOf = requires(T&& t) 
{
    requires std::same_as<std::remove_cvref_t<decltype(*std::ranges::begin(t))>, InnerType >;
    std::ranges::end(t);
};

void print(const RangeOf<char> auto& seq) {
    std::cout << "char seq: " << std::string_view(seq.data(), seq.size()) << std::endl;
}

int main() {    
    auto a_view = std::string_view("hello");
    print(a_view);
}

CodePudding user response:

When you use concepts with templates as you did there, the type you are trying to constraint matches the very first type-argument. Everything else you specify comes after that in the order you specified. Here's a simplified example:

#include <concepts>

template <class T1, class T2, class T3>
concept ThreeTypes = std::same_as<T1, int> &&
                     std::same_as<T2, short> && 
                     std::same_as<T3, long>;


template <ThreeTypes<short, long> T>
void foo(T t) {

}

int main() {
    foo(14); // OK
    // foo(14.1); // Won't compile
}

See online.

  • Related