Class 带有可变构造函数的模板;将参数存储到 std::vector< std::shared_ptr<>> >
Class template with variadic constructor; storing parameters into std::vector< std::shared_ptr<> >
我正在尝试设计一个 class 模板,其中它的构造函数具有可变参数构造函数并且每个参数类型必须是相同的数据类型。然后我想将所有参数存储到 std::vector< std::shared_ptr<T> >
容器中。如果没有传入参数,那么 vector<>
中的第一个 shared_ptr<>
将被设置并存储为 nullptr
。我也希望能够跟踪传入了多少参数。到目前为止,这是我尝试过的方法。
声明
template<typename T>
class Nodes {
private:
unsigned m_numParams;
std::vector<sstd::shared_ptr<T>> m_vNodes;
public:
explicit Nodes( T... ); // Not sure how to set first parameter as being default to nullptr along with the variadic syntax.
};
定义
template<typename T>
Nodes<T>::Nodes( T... ) {
if ( /* no parameters passed in or 1st parameter is nullptr */ ) {
T* ptr = nullptr;
m_vNodes.push_back( ptr );
} else {
for each ( /* parameter with same data type */ ) {
std::shared_ptr<T> sptr( new T() );
m_vNodes.push_back( sptr );
}
}
m_numParams = m_vNodes.size();
}
我对基本模板的理解还不错,但我对可变参数函数或模板的使用有限,我正在尝试学习新方法以进一步提高我在 c++ 语言中的整体技能。我想知道我最初的方法在逻辑上是否正确;如果这个概念可以实现,如果可以的话,什么是最有效的实现方式,所以当我使用这个 class 模板时,这就是我所期望的,并且实际上已经发生了,就像在这个例子中一样下面:
#include "SomeHeader.h"
int main() {
int x = 3;
int y = 5;
int z = 7;
Nodes<int> someNodes( x, y, z );
return 0;
}
内部节点私有成员变量 shared_ptr<int>
where
Nodes::m_vNodes[0] = address of x with value 3 stored
Nodes::m_vNodes[1] = address of y with value 5 stored
Nodes::m_vNodes[2] = address of z with value 7 stored
如果没有传递参数...
#include "SomeHeader.h"
int main() {
Nodes<int> someNodes();
return 0;
}
内部成员变量将有一个“nullptr”存储在 vector[0] 位置。我是否还需要实现它的默认构造函数 Nodes();或者这是可以通过一个构造函数实现的吗?
一旦我让这个构造函数正常工作,那么我就可以毫无问题地继续编写函数或方法来添加、删除、检索、存储、排列或排序数据、比较数据或操作数据。我一直在这里和那里搜索,但似乎没有找到与我正在寻找的内容相关的任何内容。任何提示、建议、帮助、链接或示例都将不胜感激,在此先感谢您。
initializer_list
似乎是更好的选择,但是对于可变模板,它应该是这样的:
template<typename T>
class Nodes {
private:
unsigned m_numParams;
std::vector<std::shared_ptr<T>> m_vNodes;
public:
Nodes() : m_numParams(0), m_vNodes{nullptr} {}
template <typename ... Ts>
explicit Nodes( Ts&&...ts) :
m_numParams(sizeof...(Ts)),
m_vNodes{std::make_shared<T>(std::forward<Ts>(ts))...}
{}
};
与 initializer_list
:
explicit Nodes(std::initializer_list<T> ini) :
m_numParams(ini.size())
{
for (auto&& e : ini) {
m_vNodes.push_back(std::make_shared<T>(e));
}
}
我正在尝试设计一个 class 模板,其中它的构造函数具有可变参数构造函数并且每个参数类型必须是相同的数据类型。然后我想将所有参数存储到 std::vector< std::shared_ptr<T> >
容器中。如果没有传入参数,那么 vector<>
中的第一个 shared_ptr<>
将被设置并存储为 nullptr
。我也希望能够跟踪传入了多少参数。到目前为止,这是我尝试过的方法。
声明
template<typename T>
class Nodes {
private:
unsigned m_numParams;
std::vector<sstd::shared_ptr<T>> m_vNodes;
public:
explicit Nodes( T... ); // Not sure how to set first parameter as being default to nullptr along with the variadic syntax.
};
定义
template<typename T>
Nodes<T>::Nodes( T... ) {
if ( /* no parameters passed in or 1st parameter is nullptr */ ) {
T* ptr = nullptr;
m_vNodes.push_back( ptr );
} else {
for each ( /* parameter with same data type */ ) {
std::shared_ptr<T> sptr( new T() );
m_vNodes.push_back( sptr );
}
}
m_numParams = m_vNodes.size();
}
我对基本模板的理解还不错,但我对可变参数函数或模板的使用有限,我正在尝试学习新方法以进一步提高我在 c++ 语言中的整体技能。我想知道我最初的方法在逻辑上是否正确;如果这个概念可以实现,如果可以的话,什么是最有效的实现方式,所以当我使用这个 class 模板时,这就是我所期望的,并且实际上已经发生了,就像在这个例子中一样下面:
#include "SomeHeader.h"
int main() {
int x = 3;
int y = 5;
int z = 7;
Nodes<int> someNodes( x, y, z );
return 0;
}
内部节点私有成员变量 shared_ptr<int>
where
Nodes::m_vNodes[0] = address of x with value 3 stored
Nodes::m_vNodes[1] = address of y with value 5 stored
Nodes::m_vNodes[2] = address of z with value 7 stored
如果没有传递参数...
#include "SomeHeader.h"
int main() {
Nodes<int> someNodes();
return 0;
}
内部成员变量将有一个“nullptr”存储在 vector[0] 位置。我是否还需要实现它的默认构造函数 Nodes();或者这是可以通过一个构造函数实现的吗?
一旦我让这个构造函数正常工作,那么我就可以毫无问题地继续编写函数或方法来添加、删除、检索、存储、排列或排序数据、比较数据或操作数据。我一直在这里和那里搜索,但似乎没有找到与我正在寻找的内容相关的任何内容。任何提示、建议、帮助、链接或示例都将不胜感激,在此先感谢您。
initializer_list
似乎是更好的选择,但是对于可变模板,它应该是这样的:
template<typename T>
class Nodes {
private:
unsigned m_numParams;
std::vector<std::shared_ptr<T>> m_vNodes;
public:
Nodes() : m_numParams(0), m_vNodes{nullptr} {}
template <typename ... Ts>
explicit Nodes( Ts&&...ts) :
m_numParams(sizeof...(Ts)),
m_vNodes{std::make_shared<T>(std::forward<Ts>(ts))...}
{}
};
与 initializer_list
:
explicit Nodes(std::initializer_list<T> ini) :
m_numParams(ini.size())
{
for (auto&& e : ini) {
m_vNodes.push_back(std::make_shared<T>(e));
}
}