概念模板参数推导
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
}
下面的概念有两个模板参数,但在使用过程中只指定了一个。 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
}