小编Tom*_*ton的帖子

为什么范围不为非连续范围提供类型擦除视图?

我想要一个可以接受固定值类型的任何范围/视图的函数。

int main()
{
    std::array<std::pair<int, int>, 2> a{...};
    std::array<std::pair<int, int>, 3> b{...};
    generic_fun(a);
    generic_fun(b);

};
Run Code Online (Sandbox Code Playgroud)

我当然可以

template <std::ranges::range R>
    requires std::same_as<std::ranges::range_value_t<R>,std::pair<int,int>>
auto generic_fun(R range)
{
    for(const auto& element : range)
        return element.first;
}
Run Code Online (Sandbox Code Playgroud)

但 Visual Studio IDE 不知道element.

我期望范围库有类似的类型

template <typename T>
struct view
{
    template <std::ranges::range R>
        requires std::same_as<std::ranges::range_value_t<R>, T>
    view(R);
    T* begin() const;
    T* end() const;
};
Run Code Online (Sandbox Code Playgroud)

这会给我 ide 支持

auto generic_fun(view<std::pair<int,int>> a)
{
    for (const auto& b : a)
        return b.first;
}
Run Code Online (Sandbox Code Playgroud)

为什么范围库中不存在这样的类型?定义一个抽象出除范围/迭代器的值类型之外的所有类型的类型在技术上是不可行的吗?或者没有人关心这样做,因为唯一的原因是 ide 支持? …

c++ iterator c++-concepts c++20 std-ranges

7
推荐指数
1
解决办法
893
查看次数

lambda 和成员函数指针的区别

在我的回答中巴里指出最好打电话,views::transform(&Planter::getPlants)因为views::transform([](Planter const& planter){...不小心复制了。

#if 1
    auto plants = planters
        | std::views::transform([](Planter const& planter){ return planter.getPlants();})
        | std::views::join
        | std::views::common
        ;
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
// Plant copy constructor
#else
    auto plants = planters
        | std::views::transform(&Planter::getPlants)
        | std::views::join
        ;
#endif
// Plant copy constructor
// Plant copy constructor
Run Code Online (Sandbox Code Playgroud)

Plant是一个围绕的包装器intPlanter也是一个围绕的包装器std::vector<int>

https://godbolt.org/z/dr7PM5Tvd

c++ std-ranges

7
推荐指数
1
解决办法
157
查看次数

固定大小跨度的结构化绑定

在发现您可以符合人体工程学地将 s 转换 std::vector为固定大小的std::spans 后,我想我应该尝试以下结构化绑定std::vector

auto _ = std::vector{ 1,2,3 };
std::span<int, 3> a = std::span(_).first<3>();
auto [b,c,d] = a;
Run Code Online (Sandbox Code Playgroud)

但它不起作用https://godbolt.org/z/nhrYn65dW

然而,从P1024 std::span 的可用性增强看来这应该是合法的

添加对固定大小跨度的结构化绑定支持?一致同意

c++ structured-bindings c++20

7
推荐指数
1
解决办法
228
查看次数

decltype 不保留结构化绑定中的 ref 限定符

通常 decltype 保留 ref 限定符

auto a = 0;
auto& a_ref = a;
static_assert(std::is_reference_v<decltype(a_ref)>);
Run Code Online (Sandbox Code Playgroud)

但当它的参数是从结构化绑定获得时显然不是

auto a = 0;
auto& a_ref = a;
static_assert(std::is_reference_v<decltype(a_ref)>);
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/qWT574fr9

我很确定,i并且d是这里的参考。它们应该是根据旧的新事物,智能感知是这样告诉我的。

c++ decltype type-traits structured-bindings

6
推荐指数
1
解决办法
103
查看次数

Range-v3:为什么这里需要 range::to_vector ?

我正在尝试计算一个反转的views::partial_sum. 下面的代码给出了非反转的partial_'min'的预期结果,但我需要使用它ranges::to_vector来取消views::reverse最终结果(因为你不能views::reversea views::partial_sum)。但是,当第二个to_vector未注释时,views::valuesofintermediate2全部为零(尽管键计算正确)。取消注释第一个to_vector可以解决此问题,但我想知道为什么?我是否有可能避免第一个to_vector?或者我是否应该不理会理解而只是插入to_vectors 直到代码起作用。

    auto input = std::vector<float>{} | actions::push_back(views::iota(0u, COUNT)) | actions::shuffle(std::default_random_engine{});;

    auto intermediate1 = views::zip(views::iota(0u, COUNT), input)
        //| to_vector
        ;
    auto intermediate2 = intermediate1
        | views::reverse
        | views::partial_sum(
            [](std::pair<unsigned, float> a, std::pair<unsigned, float> b)
            {
                if (a.second > b.second)
                    return b;
                else
                    return a;
            })
        //| to_vector
        ;
    auto ans = intermediate2
        //| views::reverse
        ;

    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ range-v3 c++20 std-ranges

5
推荐指数
1
解决办法
859
查看次数

ghci 可以告诉我们正在使用哪个类的实例吗

这是一些 ghci

> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
> :t allEqual
allEqual :: Eq a => [a] -> [a] -> Bool
> :t allEqual <*> reverse
allEqual <*> reverse :: Eq a => [a] -> Bool
> :t reverse
reverse :: [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

我正在尝试弄清楚 中应用程序的实例到底是什么allEqual <*> reverse

我试图推理

f (a -> b) :: [a] -> [a] -> Bool
f a :: [a] -> [a]
f …
Run Code Online (Sandbox Code Playgroud)

haskell

5
推荐指数
2
解决办法
94
查看次数

协程:co_yielded string_views 是否悬空?

我想混合 co_yielding 字符串文字和std::strings

Generator<std::string_view> range(int first, const int last) {
    while (first < last) {
        char ch = first++;
        co_yield " | ";
        co_yield std::string{ch, ch, ch};
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想知道 std::string 的生命周期?

如果您知道要string_view立即食用,也许是安全的?

for(auto sv : range(65, 91))
   std::cout << sv;
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/d5eoP9aTE

你可以像这样保证安全

Generator<std::string_view> range(int first, const int last) {
    std::string result;
    while (first < last) {
        char ch = first++;
        co_yield " | ";
        result = std::string{ch, ch, ch};
        co_yield result;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ coroutine dangling-pointer c++23

3
推荐指数
1
解决办法
105
查看次数

如何初始化 cppwinrt TimeSpan 结构?

根据 cppwinrt、迁移 C++... 的主文档,“设置 Windows 运行时属性值的等效 C++/WinRT 源代码调用与 Windows 运行时属性同名的方法以及新值的参数:

record.UserState(newValue); // Set the UserState property
Run Code Online (Sandbox Code Playgroud)

但是,当尝试设置 Duration 对象的 TimeSpan 属性时,这似乎不起作用:

TimeSpan ts = TimeSpan(6000000);
Duration duration = Duration();
duration.TimeSpan(ts);
Run Code Online (Sandbox Code Playgroud)

第三行在“duration”上产生一个智能感知错误:“调用类类型的对象,而没有适当的运算符或将函数转换为指针函数类型。” 同一行的构建错误是“Term 不计算为采用 1 个参数的函数”。我应该补充一点,Duration 的构造函数似乎有一个参数,即 TimeSpan,但这也不被接受。使用 cppwinrt 时如何设置 Duration 的 TimeSpan 属性?

c++-winrt

2
推荐指数
1
解决办法
1724
查看次数

使用范围/视图而不是模板进行通用编程?

我想要具有接受任何固定类型容器的功能。例如,一个函数将接受std::array<float,1>std::array<float,2>

我认为这在范围内是可能的,但我意识到我的理解非常肤浅。

我可以不使用模板吗?


编辑:我们可以使用范围库定义一个类型,该类型将执行与跨度相同的操作,但适用于非连续容器?也许我没有正确表达我的问题,我可能指的是视图而不是容器。

c++ c++20 std-ranges

1
推荐指数
1
解决办法
266
查看次数