概念模板参数推导

concepts template argument deduction

下面的概念有两个模板参数,但在使用过程中只指定了一个。 T 总是推导而 InnerType 总是需要显式指定的参数吗?

#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);
}

当您像在此处那样使用带有模板的概念时,您尝试限制的类型与第一个 type-argument 相匹配。您指定的所有其他内容都按照您指定的顺序出现。这是一个简化的例子:

#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.