for*_*818 5 c++ arrays templates size-type
受到这个问题的触发,我想到了的代码(它boost::array在我的答案中,但也适用于std::array):
template <std::array<char,1>::size_type size>
void DataTransform(std::array<char, size> data) {
}
Run Code Online (Sandbox Code Playgroud)
而且我一点都不快乐<std::array<char,1>::size_type。我必须实例化一定大小才能知道size_type。因为std::array我本可以使用size_t,但是一般情况又如何呢?如果size_type不是size_t呢?甚至更笼统(即不适用std::array),如果size_type不同的尺寸不同(愚蠢但可能)会怎样?
我知道这个问题是学术性的,有很多方法可以完全避免这个“问题”(例如,我可以通过迭代器)。无论如何,我想知道...
确定要实例化(类型为)的size_typefor模板的干净方法是什么?sizesize_type
更笼统地说,这个问题可以表述为:在实际实例化模板之前,如何获得可能依赖于模板参数的typedef模板。
这是一个C ++ 11解决方案,它采用未推导的数组,然后提取默认模板参数中涉及的类型和大小,最后执行an enable_if来检查是否确实给了我们std::array:
#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!
}
Run Code Online (Sandbox Code Playgroud)
通过默认的模板参数执行所有这些操作意味着这对SFINAE友好(所有检查均在替换期间完成)。但是,与C ++ 17解决方案相比,这也是一个很大的问题:)
我应该提一下,尽管它std::tuple_size(与原始问题基本上具有相同的问题)确实使使用变得平淡无奇std::size_t。那真的不是问题,因为std::size_t应该能够保留所有相关值,并且我们仍然提取并提供TSize上面的“正确”信息。但是,您无需std::tuple_size编写自己的给定TSize值并仅推导出size值的代码就可以完成所有这些操作:
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;
};
Run Code Online (Sandbox Code Playgroud)