gpt4 book ai didi

c++ - 在 C++ 中自然禁止包装类

转载 作者:行者123 更新时间:2023-11-30 01:52:07 25 4
gpt4 key购买 nike

因此,我发现使用集合算法更自然,而不是使用一对迭代器。所以,我写了一些函数,比如

template <typename R>
void sort(R& range) {
return std::sort(std::begin(range), std::end(range));
}

并且有可能使用我在包装器类之后编写的部分集合,它只包含一对迭代器。

template <typename T>
class Range{
public:
Range(T begin, T end): begin_(begin), end_(end) {}

const T& begin() {
return begin_;
}

const T& end() {
return end_;
}


private:
T begin_, end_;
};

至此一切都很好。现在我想要一个函数来复制/(如果可能的话移动)它的参数并返回新的集合。

我是这样写的:

template <typename R>
R sorted(R range) {
sort(range);
return std::move(range);
}

这很好,除非我用我的包装器 Range 类内部集合调用它。我确实理解只有迭代器类型通常不可能检索集合类型来创建新集合,但我想至少禁止使用此 Wrapper 调用它。

我明白我可以使用 enable_ifstatic_assert 来检查它是否属于特定的 Range 类我会那样做,除非我找到更好的方法。但我想以更一般的方式以某种方式禁止它,这样类似的实现也将无法编译。

有什么想法吗?

最佳答案

你可以像这样删除函数:

template <typename T>
void sorted(const Range<T>& range) = delete;

否则你可以禁止对象的复制和移动,所以它只能作为引用使用

template <typename T>
class Range{
public:
Range(const Range&) = delete;
Range(Range&&) = delete;

Range& operator =(const Range&) = delete;
Range& operator =(Range&&) = delete;

// previous code
};

关于c++ - 在 C++ 中自然禁止包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com