How to fill an array of unique_ptr?

前端 未结 3 548
眼角桃花
眼角桃花 2020-12-31 22:21

Is it possible to use std:fill to fill an array of unique_ptrs? The intention is to have distinct pointers to distinct objects which are initialize

相关标签:
3条回答
  • 2020-12-31 22:49

    I don't think you can do it with std::fill() but it is trivial to do with std::generate():

    std::unique_ptr<int> array[10];
    std::generate(std::begin(array), std::end(array),
                  []{ return std::unique_ptr<int>(new int(17)); });
    
    0 讨论(0)
  • 2020-12-31 22:58

    No, but this is what std::generate is for.

    Instead of being given a single value that's copied throughout the target range, std::generate is given a "generator" function that creates each value as needed.

    So, probably, something like this:

    std::unique_ptr<int> ar[3];
    std::generate(
       std::begin(ar),
       std::end(ar),
       []() { return std::make_unique<int>(1); }
    );
    

    I haven't tried it, and don't know whether you need to fiddle with it at all in order to avoid problems stemming from non-copyability. Hopefully move semantics are enough.

    (Of course, in C++11, you will need your own make_unique function.)

    By the way, your .begin() and .end() were wrong (arrays don't have member functions), so (thanks to a reminder from songyuanyao) I have corrected those.

    0 讨论(0)
  • 2020-12-31 23:01

    Another solution:

    std::unique_ptr<int> ar[3];
    
    size_t i;
    for (i = 0; i < elementsof(ar); ++i) {
        ar[i].reset(new int);
    }
    
    0 讨论(0)
提交回复
热议问题