检查概念中的 constexpr
Checking for constexpr in a concept
我刚开始做概念。检查表达式的语法非常有用,它消除了我在 sfinae 中的很多样板。但是我想知道如何检查表达式是否可以在 constexpr 上下文中使用。有时这些表达式会导致无效。我能想象的方式是这样的,没有注释 constexpr 关键字:
template<typename T>
concept foo = requires(T t) {
/* constexpr */ { t.bar(); } -> std::same_as<void>;
/* constepxr */ { T::foo; };
}
但是,我非常怀疑这是不是正确的语法。有没有一种简单的方法来检查概念中表达式的constexpr-ness?
我不想检查 constexpr 函数的求值是否不会因 t
的所有可能值而失败,我想知道是否可以将该表达式放在编译器可以访问的位置期望在编译时可以评估某些东西。
我认为可以使用 std::bool_constant
创建预期的概念,它具有 属性 在其非常量表达式的参数中替换失败不是编译错误,而只是使概念 false
.
建议的解决方案是
#include <concepts>
#include <type_traits>
template<typename T>
concept HasConstexprVoidBar =
requires(T t) {
{ t.bar() } -> std::same_as<void>;
{ std::bool_constant<(T{}.bar(), true)>() } -> std::same_as<std::true_type>;
};
struct A {
constexpr void bar() {}
};
struct B {
void bar() {}
};
int main() {
// concept check passes for constexpt A::bar()
static_assert( HasConstexprVoidBar<A> );
// concept check fails for B::bar()
static_assert( !HasConstexprVoidBar<B> );
}
此处概念 HasConstexprVoidBar
对于具有 constexpr void
方法 bar
的结构 A
已成功验证,对于结构 B
的计算结果为 false
没有-constexpr
方法。
我刚开始做概念。检查表达式的语法非常有用,它消除了我在 sfinae 中的很多样板。但是我想知道如何检查表达式是否可以在 constexpr 上下文中使用。有时这些表达式会导致无效。我能想象的方式是这样的,没有注释 constexpr 关键字:
template<typename T>
concept foo = requires(T t) {
/* constexpr */ { t.bar(); } -> std::same_as<void>;
/* constepxr */ { T::foo; };
}
但是,我非常怀疑这是不是正确的语法。有没有一种简单的方法来检查概念中表达式的constexpr-ness?
我不想检查 constexpr 函数的求值是否不会因 t
的所有可能值而失败,我想知道是否可以将该表达式放在编译器可以访问的位置期望在编译时可以评估某些东西。
我认为可以使用 std::bool_constant
创建预期的概念,它具有 属性 在其非常量表达式的参数中替换失败不是编译错误,而只是使概念 false
.
建议的解决方案是
#include <concepts>
#include <type_traits>
template<typename T>
concept HasConstexprVoidBar =
requires(T t) {
{ t.bar() } -> std::same_as<void>;
{ std::bool_constant<(T{}.bar(), true)>() } -> std::same_as<std::true_type>;
};
struct A {
constexpr void bar() {}
};
struct B {
void bar() {}
};
int main() {
// concept check passes for constexpt A::bar()
static_assert( HasConstexprVoidBar<A> );
// concept check fails for B::bar()
static_assert( !HasConstexprVoidBar<B> );
}
此处概念 HasConstexprVoidBar
对于具有 constexpr void
方法 bar
的结构 A
已成功验证,对于结构 B
的计算结果为 false
没有-constexpr
方法。