表达式的概念满足可以同时包含类型和引用吗?
Can a concept satisfaction of an expression, contains both type and the reference?
有没有办法让下面的代码不那么臃肿?
我的意思是以某种方式连接类型和引用(||
不起作用)。
template<typename T>
concept IntegralVector = std::integral<typename T::value_type> &&
requires(T t)
{
{ t.size() } -> std::convertible_to<std::size_t>;
}
&& (requires(T t)
{
{ t[0] } -> std::same_as<typename T::value_type&>;
} || requires(T t)
{
{ t[0] } -> std::same_as<typename T::value_type>;
});
一个有效的技巧可以是:
{ 0 + t[0] } -> std::integral;
但我想坚持typename T::value_type
你可能想要这样的东西:
template <typename T, typename U>
concept decays_to = std::same_as<std::decay_t<T>, U>;
用作:
template<typename T>
concept IntegralVector =
std::integral<typename T::value_type>
&& requires (T t) {
{ t.size() } -> std::convertible_to<std::size_t>;
{ t[0] } -> decays_to<typename T::value_type>;
};
这也捕获了 value_type const&
作为一个选项,我不确定这是有意省略的。
另一种选择是使用 C++23 auto(x)
,即语言中的 decay-copy:
#include<concepts>
template<typename T>
concept IntegralVector = std::integral<typename T::value_type> &&
requires(T t) {
{ t.size() } -> std::convertible_to<std::size_t>;
{ auto(t[0]) } -> std::same_as<typename T::value_type>;
};
有没有办法让下面的代码不那么臃肿?
我的意思是以某种方式连接类型和引用(||
不起作用)。
template<typename T>
concept IntegralVector = std::integral<typename T::value_type> &&
requires(T t)
{
{ t.size() } -> std::convertible_to<std::size_t>;
}
&& (requires(T t)
{
{ t[0] } -> std::same_as<typename T::value_type&>;
} || requires(T t)
{
{ t[0] } -> std::same_as<typename T::value_type>;
});
一个有效的技巧可以是:
{ 0 + t[0] } -> std::integral;
但我想坚持typename T::value_type
你可能想要这样的东西:
template <typename T, typename U>
concept decays_to = std::same_as<std::decay_t<T>, U>;
用作:
template<typename T>
concept IntegralVector =
std::integral<typename T::value_type>
&& requires (T t) {
{ t.size() } -> std::convertible_to<std::size_t>;
{ t[0] } -> decays_to<typename T::value_type>;
};
这也捕获了 value_type const&
作为一个选项,我不确定这是有意省略的。
另一种选择是使用 C++23 auto(x)
,即语言中的 decay-copy:
#include<concepts>
template<typename T>
concept IntegralVector = std::integral<typename T::value_type> &&
requires(T t) {
{ t.size() } -> std::convertible_to<std::size_t>;
{ auto(t[0]) } -> std::same_as<typename T::value_type>;
};