Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建容器的模板类_C++_Templates - Fatal编程技术网

C++ 创建容器的模板类

C++ 创建容器的模板类,c++,templates,C++,Templates,我试图创建一个类作为容器包装器,类似这样 #include <vector> template <typename T, typename U> class Test { T<U> list; }; int main() { Test<std::vector, int> test; } #include <vector> template <typename T> class Test { T l

我试图创建一个类作为容器包装器,类似这样

#include <vector>

template <typename T, typename U>
class Test {
    T<U> list;
};

int main() {
  Test<std::vector, int> test;
}
#include <vector>

template <typename T>
class Test {
    T list;
};

int main() {
  Test<std::vector<int>> test;
}
#包括
模板
课堂测试{
T表;
};
int main(){
试验;
}
但这行不通。我知道这样使用它会有用的

#include <vector>

template <typename T, typename U>
class Test {
    T<U> list;
};

int main() {
  Test<std::vector, int> test;
}
#include <vector>

template <typename T>
class Test {
    T list;
};

int main() {
  Test<std::vector<int>> test;
}
#包括
模板
课堂测试{
T表;
};
int main(){
试验;
}
但是我该如何写插入语呢

template <typename T>
class Test {
    T list;

public:
    void insert(??? element) {
        ...
    }
};
模板
课堂测试{
T表;
公众:
空心插入件(?元件){
...
}
};
TIA,Narase

但这行不通

对于
Test
的第一个片段,由于
std::vector
有,我们必须使用模板参数在
T
的声明中指定这些模板参数的存在,如下所示。 这里我使用变量一,然后
T
T=std::vector
和编译错误被删除

我该如何写插入语

template <typename T>
class Test {
    T list;

public:
    void insert(??? element) {
        ...
    }
};
下面的代码还显示了
Test::insert
的实现示例。 因为在C++11及以上版本中,这里我将转发引用(Scott Meyers称之为)应用于它。 在这种方法中,我们不需要在
Test::insert
定义中指定
Test::list
的值类型,向
Test::insert
传递错误的类型会导致编译错误。 如果需要
std::vector
的值类型,则可以使用成员类型
std::vector::value\u type

template <template<class...> class T, class ...U>
class Test
{
    T<U...> list;

public:
    template<class ...V>
    void insert(V&& ...element) {
        list.insert(std::forward<V>(element)...);
    }

    typename T<U...>::iterator begin() noexcept {
        return list.begin();
    }

    typename T<U...>::iterator end() noexcept {
        return list.end();
    }

    using value_type = typename T<U...>::value_type;
};
作为另一个示例,此包装器类还可用于
std::map
,如下所示:

static\u断言(
std::is_same::value,“oops!”;//好啊
测试测试;//好啊
测试插入物(标准:制作配对(1,11));
测试插入物(标准:制作成对(2,99));
for(auto it=test.begin();it!=test.end();+it){

std::cout first最简单的方法是

template <typename T>
class Test {
    ....
    void insert(const typename T::value_type& element);
void insert(typename T::value_type&& element);