从概念推导模板参数
Deduce template parameter from concept
我正在学习模板和概念。我正在尝试为派生自 class 的类型创建一个概念,但此 class 是一个模板。
template<typename T>
struct CAA{};
template<typename T, typename T2>
concept DerivedFromAA = requires() {std::derived_from<CAA<T2>,T>;};
是否可以在函数中使用这样的概念而不必明确告诉它 class 的模板类型?我对如何定义这样的概念的想法是错误的吗?
template<typename T>
void conceptTestFunc(DerivedFromAA<T> auto& aa)
{
}
//...
CAA<int> aa;
conceptTestFunc<int>(aa); // Without having to tell it "int"
(我正在用 Clang 编译它。)
模板不是类型。
所以如果 CAA
是一个模板,那么 CAA<int>
就是一个类型。
类型不能从模板派生,只能从另一种类型派生。这意味着必须对类型而不是模板进行检查。
另一方面,如果你想推导出 aa
的内部类型,那是可以做到的。
#include <concepts>
template<typename T>
struct CAA{};
template<typename T>
struct CBB{};
template<typename T, typename T2>
concept DerivedFromAA = std::derived_from<CAA<T2>,T>;
template<template <typename> typename Outer, typename T>
requires DerivedFromAA<Outer<T>, T>
void conceptTestFunc(Outer<T>& aa)
{
}
int main() {
CAA<int> aa;
conceptTestFunc(aa);
CBB<int> bb;
conceptTestFunc(bb); // This fails
}
你可能会
template<typename T>
concept DerivedFromAA = requires(T t) {[]<typename U>(CAA<U>&){}(t);};
static_assert(DerivedFromAA<CAA<int>>);
gcc 不喜欢 requires 中的 lambda,因此您可以在外部创建虚拟辅助函数。
我正在学习模板和概念。我正在尝试为派生自 class 的类型创建一个概念,但此 class 是一个模板。
template<typename T>
struct CAA{};
template<typename T, typename T2>
concept DerivedFromAA = requires() {std::derived_from<CAA<T2>,T>;};
是否可以在函数中使用这样的概念而不必明确告诉它 class 的模板类型?我对如何定义这样的概念的想法是错误的吗?
template<typename T>
void conceptTestFunc(DerivedFromAA<T> auto& aa)
{
}
//...
CAA<int> aa;
conceptTestFunc<int>(aa); // Without having to tell it "int"
(我正在用 Clang 编译它。)
模板不是类型。
所以如果 CAA
是一个模板,那么 CAA<int>
就是一个类型。
类型不能从模板派生,只能从另一种类型派生。这意味着必须对类型而不是模板进行检查。
另一方面,如果你想推导出 aa
的内部类型,那是可以做到的。
#include <concepts>
template<typename T>
struct CAA{};
template<typename T>
struct CBB{};
template<typename T, typename T2>
concept DerivedFromAA = std::derived_from<CAA<T2>,T>;
template<template <typename> typename Outer, typename T>
requires DerivedFromAA<Outer<T>, T>
void conceptTestFunc(Outer<T>& aa)
{
}
int main() {
CAA<int> aa;
conceptTestFunc(aa);
CBB<int> bb;
conceptTestFunc(bb); // This fails
}
你可能会
template<typename T>
concept DerivedFromAA = requires(T t) {[]<typename U>(CAA<U>&){}(t);};
static_assert(DerivedFromAA<CAA<int>>);
gcc 不喜欢 requires 中的 lambda,因此您可以在外部创建虚拟辅助函数。