Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从std::array等获取size_类型的惯用方法_C++_Arrays_Templates_Size Type - Fatal编程技术网

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