我想创建一个模板,它采用现有的类并使其不可复制和不可分配,但不依赖继承。例如,考虑
std::vector<int>
。我想以 NonCopyable<T>
变得不可复制的方式应用模板 std::vector<int>
。
这是我的目标的简化版本:
NonCopyable<std::vector<int>> vec1{1, 2, 3};
NonCopyable<std::vector<int>> vec2(vec1); // should not compile
vec2 = vec1; // should not compile
假设我无法修改原始类并且不想使用继承,那么实现此行为的适当模板方法是什么?
这是我的此类包装器模板类的初稿。
#include <vector>
template< typename T >
struct NonCopyable
{
private:
T value;
public:
NonCopyable( const NonCopyable<T>& t ) noexcept = delete;
NonCopyable( NonCopyable<T>& t ) noexcept = delete;
NonCopyable( NonCopyable<T>&& t ) noexcept = delete;
template< typename... Targs >
NonCopyable( const Targs... args ) noexcept : value{ args... } {
}
operator T&() const = delete;
NonCopyable& operator = ( const NonCopyable& ) = delete;
NonCopyable& operator = ( NonCopyable& ) = delete;
NonCopyable& operator = ( NonCopyable&& ) = delete;
};
int main( [[maybe_unused]] int argc, [[maybe_unused]]char* argv[] ) {
NonCopyable< std::vector<int> > vec1{ 1, 2, 3, 4 };
//NonCopyable< std::vector<int> > vec2( vec1 ); // would lead to the following compiler error:
/*
src/test2_2.cpp:25:48: error: use of deleted function ‘NonCopyable<T>::NonCopyable(NonCopyable<T>&) [with T = std::vector<int>]’
25 | NonCopyable< std::vector<int> > vec2( vec1 ); // should not compile
| ^
*/
//vec2 = vec1; // would lead to the following compiler error:
/*
src/test2_2.cpp:31:12: error: use of deleted function ‘NonCopyable<T>& NonCopyable<T>::operator=(NonCopyable<T>&) [with T = std::vector<int>]’
31 | vec2 = vec1;
| ^~~~
*/
return 0;
}
这是你的想法吗?