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成为朋友,然后用完了想法。
答案 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(...);
}