gpt4 book ai didi

c++ - 我们不能从 initializer_list 创建一个 std::array,但是我们可以用一个带有可变参数的辅助函数来创建它吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:10 25 4
gpt4 key购买 nike

请考虑以下 vector类:

template<typename T, class Tuple = std::vector<T>>
class vector
{
public:
using size_type = typename Tuple::size_type;

template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, size_type>::value>>
vector(size_type n)
: m_elements(n)
{ }
template<class T = Tuple, class = std::enable_if_t<std::is_constructible<T, std::initializer_list<T>>::value>>
vector(std::initializer_list<T> init)
: m_elements(init)
{ }

private:
Tuple m_elements;
}; // class vector

template<typename T, std::size_t N>
using static_vector = vector<T, std::array<T, N>>;

template<typename T>
static_vector<T, /* N */> make_static_vector(T... elements) { /* ... */ }

问题是我想使用 std::array对于 Tuple ,但是 std::array不能从 initialiter_list 构建.这就是为什么我禁用了 vector 的相应构造函数的原因。在这种情况下。 (我知道我可以在任何一种情况下使用 std::copy(init.begin(), init.end(), m_elements.begin(),但这会产生其他问题。)

因为我想做类似 static_vector<double> x = { 1, 2, 3 }; 的事情我认为我最好的选择(随时纠正我)提供一个像make_static_vector这样的辅助函数。 . (这不如 initializer_list 漂亮,因此,请再次提出更漂亮的解决方案。)

我想写auto x = make_static_vector<double>(1, 2, 3); .我需要如何实现它?

最佳答案

一个简单的表单如下所示:

template <typename T,typename... Elements>
static_vector<T, sizeof...(Elements)>
make_static_vector(Elements... elements)
{
return static_vector<T,sizeof...(Elements)>(elements...);
}

您还需要为您的 vector 创建一个可变参数构造函数:

template <typename... Args>
vector(Args... init)
: m_elements{static_cast<T>(init)...}
{ }

如果您想在需要 double 值的情况下使用整数来避免缩小错误范围,则必须使用 static_cast

如果要使用完美转发,打字有点多,但是思路是一样的。

关于c++ - 我们不能从 initializer_list 创建一个 std::array,但是我们可以用一个带有可变参数的辅助函数来创建它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671271/

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