下面的代码就可以了
std::bitset<24> foo;
static_assert( std::same_as<std::bitset<24>,std::bitset<foo.size( )>> )
注意 foo.size( ) 的使用,它是一个 constexpr 函数。那么为什么以下不起作用
template <typename T> concept is_std_bitset = requires( T t )
{
requires std::same_as<T,std::bitset<t.size( )>>;
};
static_assert( is_std_bitset<std::bitset<24>> ) // This fails
看起来 t.size( ) 在这个概念中是无效的。这是概念定义的一般限制吗?如果是,有什么好的方法可以解决吗?
t
不存在;它从来不存在。它是一个假设的对象,概念系统用它来决定代码是否有效。表达式 t.size()
只会检查此类代码是否有效,以及该表达式的结果类型是否可以在使用它的地方使用。概念系统不会显现 T
类型的对象并实际调用该函数。
现在,如果
size
是static
会员,您可以致电T::size()
来获取bitset
尺寸。但除此之外,不行。