gpt4 book ai didi

c++ - 具有可变构造函数的类模板;将参数存储到 std::vector< std::shared_ptr<>>

转载 作者:行者123 更新时间:2023-11-28 00:06:36 26 4
gpt4 key购买 nike

我正在尝试设计一个类模板,其中其构造函数具有可变参数构造函数,并且每个参数类型必须是相同的数据类型。然后我想将所有参数存储到 std::vector< std::shared_ptr<T> > 中容器。如果没有传入参数,那么第一个 shared_ptr<>vector<>将被设置并存储为 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++ 语言中的整体技能。我想知道我最初的方法在逻辑上是否正确;如果这个概念可以实现,如果可以,那么实现它的最有效方法是什么,所以当我使用此类模板时,这就是我所期望的,并且实际上已经发生了,如下面的示例案例所示:

#include "SomeHeader.h"

int main() {

int x = 3;
int y = 5;
int z = 7;

Nodes<int> someNodes( x, y, z );

return 0;
}

内部节点私有(private)成员变量将具有 shared_ptr<int>在哪里

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

Demo

关于c++ - 具有可变构造函数的类模板;将参数存储到 std::vector< std::shared_ptr<>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com