如何从可变参数构造函数参数构造任何对象?
How to construct any object from variadic constructor parameters?
我正在尝试制作自己的容器,并且正在为我的Vector类编写一个Emplace方法。
首先,这是我的转发函数:
template<typename T>
T&& Forward(typename remove_reference<T>::Type& arg)
{
return static_cast<T&&>(arg);
}
template<typename T>
T&& Forward(typename remove_reference<T>::Type&& arg)
{
static_assert(!Internal::is_lvalue_reference<T>::Result);
return static_cast<T&&>(arg);
}
它们与std
基本相同。
现在这是我Emplace
方法:
template<typename T>
template<class... ARGS>
void MyVector<T>::Emplace(ARGS&&... args)
{
Add(Forward<ARGS>(args)...);
}
这给了我一个错误"函数不接受 2 个参数",因为 Add 不是为处理可变参数而设计的。因此,我只是在原地执行此操作:
template<typename T>
template<class... ARGS>
void MyVector<T>::Emplace(ARGS&&... args)
{
if(size >= capacity)
{
AdaptCapacity();
}
data[size++] = value;
}
我应该把什么放在_data[_size++] = value;
?如何使用可变参数构造任何"T"?如果我将 Forward 的调用传递给 T 的构造函数,它只会给我与将其传递给 Add 相同的错误,因为"..."语法。我还能做什么?
我尝试查看 std::vector,我发现的只是一些似乎没有任何定义的函数_Alty_traits::construct
(编译器内部函数?
这是否意味着我无法编写自定义 Emplace 方法?
通常,如果date
本身是vector<T>
或类似的东西,你可以这样做:
date[size++] = T(std::forward<ARGS>(args)...);
但是,如果您正在编写自己的向量,那么data
基本上拥有一些原始内存。您需要的是将对象直接构造到该原始内存中。为此,您需要放置新的:
new (date + size++) T(std::forward<ARGS>(args)...);
请注意,此放置新问题与使用可变参数等正交;在编写push_back
时也需要放置新位置。
编辑:因为你没有告诉我们date
的类型或内容,并且根据你在这里的评论,我假设你做了这样的事情:
data = new T[capacity];
如果这是你所做的,那么你必须使用我给出的第一个形式;使用第二种形式是未定义的,因为你是在另一个对象上构造一个对象(然后你永远不能调用它的析构函数)。
但是,这不是编写向量(或任何其他通用容器)的正确方法。当一个向量获取更多内存时,它应该只获取更多的内存而不构造任何东西(new T[capacity]
默认构造动态数组中的所有条目),在这种情况下,你必须使用第二种形式。
- 用于检查值是否为其任何参数的帮助程序函数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在将匿名对象作为参数传递时,不会调用任何构造函数
- 此函数如何在不传递任何参数的情况下工作?
- 高效的可变参数等于任何函数
- 如何声明一个接受任何大小的 2D 矢量参数?
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 在参数相关查找之前进行模板替换的任何方法(或解决方法?
- 部分专用化不使用其任何模板参数
- 创建一个构造函数,即Capabe获取任何数量的参数
- C++任何非类型参数的模板专用化
- 有没有办法跟踪任何编译器的模板参数推导?
- C 模板功能是否有任何方法可以采用n个参数
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 创建带有任何参数的 std::functions 的unordered_map?
- 将任何数据类型/对象作为参数传递以确定其大小