如何在 if 语句中使用概念
How to use concepts in if statement
我有一个检查类型是否可迭代的概念
template<typename T>
concept Iterable = requires(T t) {
t.begin();
};
由于重载问题,我无法在模板中使用它,所以我想做类似以下的事情:
template<typename T>
void universal_function(T x) {
if (x is Iterable)
// something which works with iterables
else if (x is Printable)
// another thing
else
// third thing
}
概念实例化是布尔值,因此它们可以在if
语句中使用。您将需要使用 if constexpr
来实现所需的行为,因为它将允许包含在不同分支中无效的代码的分支:
if constexpr (Iterable<T>) {
// ...
} else if constexpr (Printable<T>) {
// ...
} else {
// ...
}
可以直接在if
里面写requires
子句来判断表达式的有效性,像这样
template<typename T>
void universal_function(T x) {
if constepxr (requires { x.begin(); }) {
// something which works with iterables
}
else if constepxr (requires { std::cout << x; }) {
// another thing
}
else {
// third thing
}
}
但似乎只检测x.begin()
是否为well-formed对于可迭代类型是不够的,标准库已经有一个concept
,即std::ranges::range
:
if constepxr (std::ranges::range<T>) {
// something which works with iterables
}
我有一个检查类型是否可迭代的概念
template<typename T>
concept Iterable = requires(T t) {
t.begin();
};
由于重载问题,我无法在模板中使用它,所以我想做类似以下的事情:
template<typename T>
void universal_function(T x) {
if (x is Iterable)
// something which works with iterables
else if (x is Printable)
// another thing
else
// third thing
}
概念实例化是布尔值,因此它们可以在if
语句中使用。您将需要使用 if constexpr
来实现所需的行为,因为它将允许包含在不同分支中无效的代码的分支:
if constexpr (Iterable<T>) {
// ...
} else if constexpr (Printable<T>) {
// ...
} else {
// ...
}
可以直接在if
里面写requires
子句来判断表达式的有效性,像这样
template<typename T>
void universal_function(T x) {
if constepxr (requires { x.begin(); }) {
// something which works with iterables
}
else if constepxr (requires { std::cout << x; }) {
// another thing
}
else {
// third thing
}
}
但似乎只检测x.begin()
是否为well-formed对于可迭代类型是不够的,标准库已经有一个concept
,即std::ranges::range
:
if constepxr (std::ranges::range<T>) {
// something which works with iterables
}