簡體   English   中英

c ++如何斷言向量中的所有std :: shared_ptr都指的是某些東西

[英]c++ how to assert that all std::shared_ptr in a vector are referring to something

當我有一個函數接收一個應該引用某個東西的(智能)指針時,我總是按如下方式開始:

class Foo;
void doSomething(const std::shared_ptr<Foo>& pFoo)
{
    assert(pFoo);
    // ...
}

現在我正在為(智能)指針的向量(或其他容器)尋找類似的斷言條件。 我能想到的最好的是:

void doSomething(const std::vector<std::shared_ptr<Foo> >& pFoos)
{
    assert(std::all_of(pFoos.begin(), pFoos.end(), [](const std::shared_ptr<Foo>& pFoo) { return pFoo; }));
    // ...
}

我想知道這是否可以改善..可以避免lambda嗎? (我嘗試使用shared_ptr的get()方法,但模板推導失敗)或者是否有另一種斷言整個容器的方法?

還有一種方法:

assert(std::find(pFoos.begin(), pFoos.end(), nullptr) == pFoos.end());

使用標准功能表達它的另一種稍微復雜的方式:

assert(std::none_of(pFoos.begin(), pFoos.end(), std::logical_not<std::shared_ptr<Foo>>{}));

從C ++ 14開始,您可以使用std::logical_not的泛型特化:

assert(std::none_of(pFoos.begin(), pFoos.end(), std::logical_not<>{}));

您可以使用實現自己的實用程序謂詞:

struct is_nullptr
{
    template <typename T>
    bool operator()(T&& x) const noexcept { return x == nullptr; }
};

void doSomething(const std::vector<std::shared_ptr<Foo> >& pFoos)
{
    assert(!std::any_of(pFoos.begin(), pFoos.end(), is_nullptr{});
    // ...
}

和/或你自己的“范圍斷言”:

template <typename TContainer, typename TPredicate>
void range_assert(TContainer&& container, TPredicate&& p)
{
    for(auto&& x : container)
    {
        assert(p(x));
    }
}

void doSomething(const std::vector<std::shared_ptr<Foo> >& pFoos)
{
    range_assert(pFoos, [](const std::shared_ptr<Foo>& x) { return x; });
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM