【问题标题】:Is it possible to extract array size from a template argument?是否可以从模板参数中提取数组大小?
【发布时间】:2015-06-01 15:20:42
【问题描述】:

如果这是重复的,我深表歉意。我环顾四周,发现了类似的问题,但没有一模一样。

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

MyClass<int[10]> c;

如何编写模板来访问类型和数组大小?我已经尝试了所有我能想到的方法,但我无法获得它。

我的灵感来自于 std::function 模板,它让您可以使用与函数原型类似的语法,例如...

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

所以我认为对数组及其大小有类似的东西会很好。我可以使用任何最新的 c++ 功能 (c++ 11/14)。

【问题讨论】:

  • 你为什么不用std::array&lt;int, 10&gt;?太棒了,你应该使用它;-)
  • @stefan:嗯,我正在尝试为我的课程添加一些上下文语法糖。它与我使用实际数组无关。
  • 该语法是您的类的唯一有效用法,还是一种特殊情况?
  • 你应该注意一些陷阱stackoverflow.com/questions/28243371/…
  • 您可以使用std::extentstd::remove_extent,而不是编写自己的元函数来提取元素类型和数组大小。

标签: c++ templates c++11 template-meta-programming


【解决方案1】:

您可以添加如下所示的部分特化:

template <typename T, ptrdiff_t N>
class MyClass<T[N]>
{
};

这是demo

【讨论】:

  • 漂亮!谢谢你。我的语法太难了,我什么都做不了。
  • @Pradhan: int 而不是size_t 可能看起来对于一些非常不确定他(不可避免地是他)不想要陈述或支持他的印象。也就是说,至少一些旧版本的 g++ 有一个错误,实际上需要您使用size_t。我会使用定义为ptrdiff_t 的尺寸类型。
  • @Cheersandhth.-Alf 谢谢!更新了答案,但我找不到相关的 gcc 错误报告。
【解决方案2】:
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;};

现在您无需解压类型即可array_size&lt;ArrType&gt;{}array_element_t&lt;ArrType&gt;

【讨论】:

    【解决方案3】:
    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);
    };
    

    【讨论】:

    • 这不是完全矫枉过正吗?
    • 是的,只是为了一些变化。
    • “过度杀戮”。我喜欢这样:p
    • 不错。虽然它太复杂了,但它有一些我想了解更多的概念。我将使用它来提升我的模板技能。谢谢。
    • std::extent 怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多