Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 是否可以从模板参数提取数组大小?_C++_Templates_C++11_Template Meta Programming - Fatal编程技术网

C++ 是否可以从模板参数提取数组大小?

C++ 是否可以从模板参数提取数组大小?,c++,templates,c++11,template-meta-programming,C++,Templates,C++11,Template Meta Programming,如果这是重复的,我道歉。我环顾四周,发现了类似的问题,但完全不是这样 如果我像这样实例化一个模板 MyClass<int[10]> c; myc类; 如何编写模板以访问类型和数组大小?我已经尝试了所有我能想到的方法,但都没有成功 我的灵感来自std::function模板,它允许您使用与函数原型类似的语法,如 std::function<int(MyClass&)> myfunc; std::函数myfunc; 因此,我认为对于阵列和它的大小来说,有类似的

如果这是重复的,我道歉。我环顾四周,发现了类似的问题,但完全不是这样

如果我像这样实例化一个模板

MyClass<int[10]> c;
myc类;
如何编写模板以访问类型和数组大小?我已经尝试了所有我能想到的方法,但都没有成功

我的灵感来自std::function模板,它允许您使用与函数原型类似的语法,如

std::function<int(MyClass&)> myfunc;
std::函数myfunc;

因此,我认为对于阵列和它的大小来说,有类似的东西会很好。我可以使用任何最新的C++特性(C++ 11/14)。

< p>可以添加一个类似于:
template <typename T, ptrdiff_t N>
class MyClass<T[N]>
{
};
模板
类MyClass
{
};
这是一个。

模板
结构演绎
{
};
模板
结构推断::类型
>
{
使用值类型=
类型名称::标准::衰减::类型;
静态constexpr auto size=sizeof(T)/sizeof(值类型);
};
模板
结构数组_size{};
模板
结构数组_size:std::integral_常量{};
模板
结构数组_元素{};
模板
使用数组\元素\ t=typename数组\元素::type;
模板
结构数组_元素{using type=T;};

现在您可以
array\u size{}
array\u element\u t
而无需解压缩类型。

为什么不使用
std::array
?它很棒,你应该使用它;-)@stefan:嗯,我想给我的一个类添加一些上下文句法上的糖分。这与我使用实际数组无关。这是您的类的唯一有效用法,还是一种特殊情况?在这样做时,您应该注意一些陷阱,而不是编写自己的元函数来提取元素类型和数组大小,你可以使用
std::extent
std::remove\u extent
。这难道不是完全过分了吗?是的,只是为了某种多样性。“多样性过度了”。我喜欢这样:pNice。虽然它太复杂了,但它有一些概念我想了解更多。我将用它来提高我的模板技能。谢谢。那就
std::extent
?漂亮!非常感谢。我在语法方面经历了一段艰难的时光,我无法让任何东西正常工作。@Pradhan:
int
而不是
size\u t
对于一些可怜的灵魂来说,可能看起来很糟糕,他们非常不确定自己(不可避免地是一个他)不想陈述或坚持自己的印象。也就是说,至少一些旧版本的g++有一个bug,它实际上要求您使用
size\t
。我会使用定义为
ptrdiff\u t
@cheerrandhth的尺码类型。-谢谢!更新了答案,但我找不到相关的gcc错误报告。
template <typename T, typename = void>
struct deduce
{
};

template <typename T>
struct deduce<T,
  typename ::std::enable_if<
    ::std::is_array<T>{}
  >::type
>
{
  using value_type =
    typename ::std::decay<decltype(::std::declval<T>()[0])>::type;

  static constexpr auto size = sizeof(T) / sizeof(value_type);
};
template<class Arr>
struct array_size {};
template<class T, size_t N>
struct array_size<T[N]>:std::integral_constant<std::size_t, N>{};
template<class Arr>
struct array_element {};
template<class Arr>
using array_element_t = typename array_element<Arr>::type;
template<class T, size_t N>
struct array_element<T[N]>{using type=T;};