创建容器的模板类
Creating a template class of a container
本文关键字:创建 更新时间:2023-10-16
我试图创建一个类作为容器包装器,像这样
#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;
}
但是我将如何写我的插入?
template <typename T>
class Test {
T list;
public:
void insert(??? element) {
...
}
};
TIA, 奈良濑
最简单的是
template <typename T>
class Test {
....
void insert(const typename T::value_type& element);
和/或,为了完整性和移动语义合规性:
void insert(typename T::value_type&& element);
但这
行不通。
对于您的第一个Test
片段,由于std::vector
有两个模板参数,value_type
和allocator_type
,我们必须在使用模板模板参数的T
声明中指定这些模板参数的存在,如下所示。 在这里我使用可变参数,然后T<U...>
变得合法 删除了T = std::vector
和编译错误。
我将如何写我的插页?
下面的代码还显示了Test::insert
的实现示例。 由于此方法可以接受 C++11 及以上版本中的左值和右值引用,因此在这里我将转发引用(即 Scott Meyers 所说的通用引用)应用于它。 在这种方法中,我们不需要在Test::insert
定义中指定Test::list
的值类型,将错误的类型传递给Test::insert
会导致编译错误。 如果需要值类型std::vector
,可以使用成员类型std::vector::value_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::vector
:
演示 (标准::矢量)
static_assert(
std::is_same<Test<std::vector, int>::value_type, int>::value, "oops!"); // OK.
Test<std::vector, int> test; // OK
test.insert(test.end(), 11);
test.insert(test.end(), 99);
for(auto it = test.begin(); it != test.end(); ++it){
std::cout << *it << std::endl;
}
作为另一个示例,此包装类还与std::map
一起使用,如下所示:
演示 (标准::地图)
static_assert(
std::is_same<Test<std::map, int, int>::value_type, std::pair<const int, int>>::value, "oops!"); // OK.
Test<std::map, int, int> test; // OK
test.insert(std::make_pair(1, 11));
test.insert(std::make_pair(2, 99));
for(auto it = test.begin(); it!= test.end(); ++it){
std::cout << it->first << ", " << it->second << std::endl;
}
最后,这是第二个代码段的固定版本:
演示 (标准::矢量)
演示 (标准::设置)
template <class T>
class Test
{
T list;
public:
template<class ...V>
void insert(V&& ...element) {
list.insert(std::forward<V>(element)...);
}
typename T::iterator begin() noexcept {
return list.begin();
}
typename T::iterator end() noexcept {
return list.end();
}
using value_type = typename T::value_type;
};
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息