gpt4 book ai didi

c++ - make_pair 类似于不可复制类的技巧

转载 作者:行者123 更新时间:2023-11-30 00:55:46 26 4
gpt4 key购买 nike

make_pair 可以在不提及类型的情况下创建对。我想对我的类使用相同的技巧,但它继承自 boost::noncopyable,因此无法编译:

template<class Iter>
struct bit_writer : boost:noncopyable
{
Iter iter;
bit_writer(Iter iter)
: iter(iter)
{}
};

template<class Iter>
bit_writer<Iter> make_bit_writer(Iter iter)
{
return bit_writer<Iter>(iter);
}
vector<char> vec;
auto w = make_bit_writer(vec);

还有其他选择吗?我试着让 make_bit_writer 成为 friend ,然后就没主意了。

最佳答案

如果你有 C++11,你可以使用类似的东西来做到这一点:

#include <functional>
#include <utility>
#include <type_traits>

struct noncopyable_but_still_moveable {
noncopyable_but_still_moveable(const noncopyable_but_still_moveable&) = delete;
noncopyable_but_still_moveable(noncopyable_but_still_moveable&&) = default;
noncopyable_but_still_moveable() = default;
noncopyable_but_still_moveable& operator=(const noncopyable_but_still_moveable&) = default;
noncopyable_but_still_moveable& operator=(noncopyable_but_still_moveable&&) = default;
};

template <typename T>
struct test : noncopyable_but_still_moveable {
test(T) {}
// the rest is irrelevant
};

template <typename T>
test<T> make_test(T&& val) {
return test<typename std::remove_reference<T>::type>(std::forward<T>(val));
}

int main() {
auto && w = make_test(0);
}

请注意,我已将 boost::noncopyable 替换为具有已删除复制构造函数的类型。这是制作不可复制的东西的 C++11 方法,并且是必需的,因为 boost 类也是不可移动的。当然,您可以将它放在类本身中,不再继承。

如果没有 C++11,你会想使用像 Boost move 这样的东西来模拟这些语义。

关于c++ - make_pair 类似于不可复制类的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11695606/

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