gpt4 book ai didi

c++ - 具有以不同方式实现的可变参数构造函数的模板类 : What are the benefits and downfalls of each version?

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:44 29 4
gpt4 key购买 nike

我用两种不同的方式编写了这个模板类:一种使用可变参数构造函数,另一种使用 std::initializer_list<T> .出于这个问题的目的,我将以不同的方式命名类,但请注意,在我的项目中它是同一个类,因为两个版本都做同样的事情。我想知道这两个版本的优点和缺点是什么。哪个更有效?为什么?

可变版本:

#include <vector>
#include <memory>

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 ) )... }
{}
}; // Nodes

int main() {
int x = 3;
int y = 5;
int z = 7;

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

return 0;
}

std::initializer_list<T>版本

#include <vector>
#include <memory>

template<typename T>
class Nodes2 {
private:
unsigned m_numParams;
std::vector<std::shared_ptr<T>> m_vNodes;

public:
Nodes2() : m_numParams(0), m_vNodes{ nullptr } {}

explicit Nodes2( std::initializer_list<T> ini ) :
m_numParams( ini.size() ) {
for ( auto&& e : ini ) {
m_vNodes.push_back( std::make_shared<T>( e ) );
}
}

}; // Nodes2

int main() {
int x = 3;
int y = 3;
int z = 3;

std::initialize_list<int> ini{ x, y, z };
Nodes2<int> nodes2( ini );

return 0;
}

最佳答案

如果您正在创建一个通用容器,并且不知道将要存储的对象类型 (T),并且您希望允许移动构造,那么可变版本更好。

这是因为您不能从 std::initializer_list 移动,因此您的第二个版本必须复制构建 T对象。

来自 cppreference :

An object of type std::initializer_list<T> is a lightweight proxy object that provides access to an array of objects of type const T

无法对存储的对象数组进行可变访问。

关于c++ - 具有以不同方式实现的可变参数构造函数的模板类 : What are the benefits and downfalls of each version?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417442/

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