【发布时间】:2019-06-24 18:54:58
【问题描述】:
结构体HasArray 带有模板参数typename 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);
但这会在 Clang 中产生 c++11-narrowing 警告。
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]
我看不到将所有Types 类型的s 转换为T 类型的方法。有吗?
编辑感谢所有回答。我最终在打包参数和 SFINAE 上使用 static_cast<> 在不可转换时使用:
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;
};
【问题讨论】:
-
我想是
sizeof...(Types) == N;无论如何:C++11、C++14 还是 C++17? -
您想使用任何可转换为
T类型的值还是仅使用T类型的值来初始化arr? -
[at]max66,是的,这是摘录中的错字,抱歉。 @丹姆。我想用任何可转换的值构造
HasArray。
标签: c++ variadic-templates template-meta-programming sfinae template-argument-deduction