C++ 从std::array等获取size_类型的惯用方法
由触发,我提出了以下代码(在我的回答中是C++ 从std::array等获取size_类型的惯用方法,c++,arrays,templates,size-type,C++,Arrays,Templates,Size Type,由触发,我提出了以下代码(在我的回答中是boost::array,但同样适用于std::array): 模板 无效数据转换(std::数组数据){ } 我对一个纯粹的C++17解决方案会回避这个问题一点也不满意: template <auto size> void DataTransform(std::array<char, size> data) { } 模板 无效数据转换(std::数组数据){ } 让我们推断大小的类型。然后,如果您需要以某种方式使用类型,只
boost::array
,但同样适用于std::array
):
模板
无效数据转换(std::数组数据){
}
我对
一个纯粹的C++17解决方案会回避这个问题一点也不满意:
template <auto size>
void DataTransform(std::array<char, size> data) {
}
模板
无效数据转换(std::数组数据){
}
让我们推断大小的类型。然后,如果您需要以某种方式使用类型,只需在函数模板中应用decltype(size)
。下面是一个C++11解决方案,它不减少数组,然后提取默认模板参数中涉及的类型和大小,最后执行enable_if
检查我们是否确实获得了std::array
:
template <std::array<char,1>::size_type size>
void DataTransform(std::array<char, size> data) {
}
#include <array>
#include <type_traits>
template<
class TArray,
class TSize = typename TArray::size_type,
class TValue = typename TArray::value_type,
TSize size = std::tuple_size<TArray>::value>
typename std::enable_if<std::is_same<std::array<TValue, size>, TArray>::value>::type
DataTransform(TArray data)
{
// Enjoy!
}
您始终可以使用模板使用的特定类型
std::array::size\u type
不表示N
的类型
模板结构数组
即使在一般情况下,N
的类型也不依赖于some_template
实例化的任何部分,因为它是some_template
声明的一部分,尽管这个问题主要是出于好奇,我仍然坚持使用C++11,我很乐意接受C++17answer@formerlyknownas_463035818-我认为C++17之前不存在所需的机器。但如果有人证明我错了,我会很兴奋的。对不起,由于我的思维方式有一些错误,由Caleth发现,我不得不接受一个不同的答案。我不认为重新表述这个问题是有意义的,但我会接受这个问题的正确答案,我想其他答案仍然很有价值contributions@StoryTeller如果std::array
没有提供typedef,那么这确实是不可能的,我相信。std::array::size_type
并不表示N
的类型,这总是std::size_t
@Caleth是的,我知道,但我需要选择一些N
来获得std::array::size_type
,这是我想要避免的。一般来说,some_-template::some_-typedef
可能取决于N
的值(如果std::array::size_-type
就是这种情况,那就太傻了,但一般来说,你永远不知道……)即使在一般情况下,N
的类型也不取决于some_-template
实例化的任何部分,因为它是some_template
@Caleth声明的一部分,所以这个问题可能是基于一种误解,即std::array::size_type
的目的是获得std::array
的size_type
,而实际上根本不需要它。也许array::size\u type
更适合在您拥有未知类型的实例化容器时使用…@Caleth ah好的,现在我明白您的意思了。Uff,看来我真的想得太多了。然而,答案显示了在更一般的场景中有用的方法
template<class TValue, class TSize, class T>
struct MyTupleSize;
template<class TValue, class TSize, TSize size>
struct MyTupleSize<TValue, TSize, std::array<TValue, size>>
{
static constexpr TSize value = size;
};
template <class T, size_t N> struct array