gpt4 book ai didi

c++ - 使用参数包参数初始化 `std::array`

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:33 27 4
gpt4 key购买 nike

有结构HasArray带有模板参数类型名 T和 size_t N .

template<typename T, size_t N>
struct HasArray {
// enable_if sizeof...(T) equals N
template<typename ... Types, typename std::enable_if<sizeof...(Types) == N, int>::type = 0>
explicit HasArray(Types ... s) : arr { s... } {}
protected:
std::array<T, N> arr;
};

我想初始化成员数组arr与构造函数的参数包参数。

HasArray<uint32_t, 2> foo(7, 13);

但这会产生一个 c++11-narrowing Clang 中的警告。

error: non-constant-expression cannot be narrowed from type 'int' to 'std::__1::array<unsigned int, 2>::value_type' (aka 'unsigned int') in initializer list [-Wc++11-narrowing]

我看不出所有的 s的类型 Types输入 T .有吗?

编辑感谢所有回答。我最终使用了 static_cast<>不可转换时的打包参数和 SFINAE:

template<typename T, size_t N>
struct HasArray {
// Use `static_cast` to construct `arr` with `s`
// Add `enable_if` all `Types` are `is_convertible`
template<typename ... Types,
typename std::enable_if<sizeof...(Types) == N, int>::type = 0,
typename std::enable_if<(std::is_convertible<Types, T>::value && ...), int>::type = 0>
explicit HasArray(Types ... s) : arr { static_cast<T>(s)... } {}
protected:
std::array<T, N> arr;
};

最佳答案

如果你想构造std::array从任何可转换为 T 的值, 那么最简单的解决方案就是添加 static_cast<T>(...)在你的构造函数中。

template<typename T, size_t N>
struct HasArray {
template<typename ... Types,
typename std::enable_if<sizeof...(Types) == N, int>::type = 0>
explicit HasArray(Types ... s) : arr {static_cast<T>(s)... } {}
protected:
std::array<T, N> arr;
};

https://godbolt.org/z/TEoZOG

如果无法进行此类转换,也可以“SFINAE out”构造函数,但我认为在当前简单情况下默认错误消息会更好,您可以在构造函数主体中添加带有更好消息的 static_asserts。

关于c++ - 使用参数包参数初始化 `std::array`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54458449/

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