是否可以使用 C++ 20 概念来避免 const/not const 重复?

can C++20 concepts be used to avoid const/not const duplication?

提问人:Ludovic Aubert 提问时间:2/17/2022 更新时间:2/17/2022 访问量:216

问:

是否可以使用 C++ 20 概念代替模板来避免(常量/非常量)代码重复?例如(在此示例中,范围与 C++20 范围无关),两个相同的代码,一个是 const,另一个不是:

我知道有可能使用 const_cast,但我想知道是否有更好的方法来使用 C++20 概念?

template <typename Pr>
vector<span<Range> > chunk_by(vector<Range>& path, const Pr& InSameChunk)
{
    vector<span<Range> > chunks;

    int i_prev=0;
    for (int i=1;i < path.size(); i++)
    {
        if (!InSameChunk(path[i-1], path[i]))
        {
            span<Range> chunk(&path[i_prev], i - i_prev);
            chunks.push_back(chunk);
            i_prev=i ;
        }
    }
    span<Range> chunk(&path[i_prev], path.size() - i_prev);
    chunks.push_back(chunk);

    return chunks;
}

template <typename Pr>
vector<span<Range const> > chunk_by(const vector<Range>& path, const Pr& InSameChunk)
{
        vector<span<Range const> > chunks;

        int i_prev=0;
        for (int i=1;i < path.size(); i++)
        {
                if (!InSameChunk(path[i-1], path[i]))
                {
                        span<Range const> chunk(&path[i_prev], i - i_prev);
                        chunks.push_back(chunk);
                        i_prev=i ;
                }
        }
        span<Range const> chunk(&path[i_prev], path.size() - i_prev);
        chunks.push_back(chunk);

        return chunks;
}
C++(英语:C++) C++20 C++概念 常播

评论

0赞 Ludovic Aubert 2/17/2022
是的,因为我使用非常量版本的结果来更新输入
1赞 Nicol Bolas 2/17/2022
从广义上讲,没有模板的概念就没有用。我的意思是,这就是他们的目的;它们约束模板。所以我不确定在这种情况下概念会有什么帮助。
1赞 François Andrieux 2/17/2022
你总是可以用模板解决这个问题。我不认为约束使以前在这个问题上不可能的事情成为可能。
1赞 user7860670 2/17/2022
我认为这将是一个关于常量和非常量成员函数重复的问题。但是,在这种情况下,可以使用 C++ 消除重复11。您只需要将 vector 应用到 .我还应该提到,创建一个临时对象也是不必要的,可以简化为std::is_conststd::conditionalconstRangespan<Range const> chunk(&path[i_prev], i - i_prev); chunks.push_back(chunk);chunks.emplace_back(&path[i_prev], i - i_prev);

答: 暂无答案