在std::数组上使用std::extent
Using std::extent on std::array
我有一个模板化的函数,我想要static_assert
,它的类型有一个大小为3。下面的代码演示了我要做的事情,但没有工作:
template < typename T >
void foo( T& param )
{
// This line is the one that I need to figure out how to write
static_assert( 3 == std::extent< T >::value, "param must have a size of 3" );
}
int main( void )
{
int cArray[3];
std::array< int, 3 > stdArray;
foo( cArray );
foo( stdArray );
}
std::extent
是为内置数组定义的。对于std::array
,用std::tuple_size
代替。我不知道有什么特性对两者都有效,但写一个很容易:
template<typename T>
struct array_size : std::extent<T> { };
template<typename T, size_t N>
struct array_size<std::array<T,N> > : std::tuple_size<std::array<T,N> > { };
这是你的foo
,更正/概括(实例):
template < typename T >
void foo( T&& param )
{
using U = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
static_assert( 3 == array_size<U>::value, "param must have a size of 3" );
}
首选通用引用T&& param
,否则只能使用左值
这是基于iavr的解决方案。
template < typename T >
void foo( T& param )
{
static_assert( 3 == ( std::is_array< T >::value ? std::extent< T >::value : std::tuple_size< T >::value ), "param must have a size of 3" );
}
我想不出一种方法来编写一个同时处理两者的函数,但这就是重载的作用。
template <std::size_t N, typename T, std::size_t Bound>
void check_array_size( T (&)[Bound] )
{
static_assert(Bound == N, "incorrect array size");
}
template <std::size_t N, typename T, std::size_t Bound>
void check_array_size( const std::array<T,Bound>& )
{
static_assert(Bound == N, "incorrect array size");
}
template <std::size_t N>
void check_array_size( ... )
{
static_assert(N<0, "argument is not an array");
}
template <typename T>
void foo(T& param)
{
check_array_size<3>(param);
// actual function implementation...
}
我怀疑你有这个错误,因为在编译时(这是*static_assert*求值时)cArray和stdArray的尺寸是未知的,并且std::extent返回零:
http://en.cppreference.com/w/cpp/types/extent实际上,如果您将条件更改为等于零,则错误将消失:
static_assert( std::extent< T >::value == 0, "param is not zero" );
然而,正如在其他文章中已经指出的那样,std::extent不能用于std::array,只能用于内置数组,如cArrayAFTER OP's EDIT:现在您已经修改了foo以接受引用,您将得到std::extent对于cArray报告3,对于stdArray报告0(零)。因此,您将在编译时继续遇到异常,因为stdArray的维数不是3。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- std::extent 实现详细信息说明
- 为什么数组与 std::extent 第二个 imp 匹配
- 为什么 std::extent 应用于 auto&的产量为零?
- 在std::数组上使用std::extent