如何使用不继承的模板使现有类不可复制和不可分配?

问题描述 投票:0回答:1

我想创建一个模板,它采用现有的类并使其不可复制和不可分配,但不依赖继承。例如,考虑

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

假设我无法修改原始类并且不想使用继承,那么实现此行为的适当模板方法是什么?

c++
1个回答
0
投票

这是我的此类包装器模板类的初稿。

#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;
}

这是你的想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.