【问题标题】:Can a concept satisfaction of an expression, contains both type and the reference?一个表达式的概念是否满足,既包含类型又包含引用?
【发布时间】:2021-11-23 04:06:34
【问题描述】:

有没有办法让下面的代码不那么臃肿?

我的意思是以某种方式同时加入类型和引用(|| 不起作用)。

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

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    你可能想要这样的东西:

    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&amp; 作为一个选项,我不确定它是故意省略的。

    【讨论】:

    • 如果T::value_type 是参考,则不起作用。
    • @Jarod42 绝不应该这样。
    • std::vector&lt;T&amp;&gt; 是不可能的,MyVector&lt;T&amp;&gt; 可能;-)
    • @Jarod42 没关系。 value_type 应该仍然是T
    【解决方案2】:

    另一种选择是使用 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>;
    };
    

    Demo.

    【讨论】:

    • 这是最好的答案,但我的 g++11 还不支持 auto(x)。如果我记得的话,我会在g++12可用时给你答案。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多