make_pair就像非可复制类一样

时间:2012-07-27 21:02:57

标签: c++ std-pair noncopyable

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成为朋友,然后用完了想法。

2 个答案:

答案 0 :(得分:4)

如果您使用的是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的东西来模仿这些语义。

答案 1 :(得分:2)

您将需要C ++ 11并更新您的类以获取移动语义。建议的问题没有其他解决办法。

class test {
public:
    test(test&&);
    // stuff
};
test make_test(...) {
    return test(...);
}
int main() {
    // Both valid:
    auto p = make_test(...);
    auto&& p2 = make_test(...);
}