在 C++11 中使用带参数包的 decltype

Posted

技术标签:

【中文标题】在 C++11 中使用带参数包的 decltype【英文标题】:using decltype w/ parameter pack for C++11 【发布时间】:2018-09-16 19:13:54 【问题描述】:

我正在尝试从 davidhigh 回答的第二个答案 here 中获取 multi_index_t 代码以使用 C++11。 C++11 不支持auto& 类型返回。

我转换了类的返回类型,但我不明白如何/是否可以在不使用 C++14 的情况下支持辅助函数 multi_index()

代码:

#include<array>

template<int dim>
struct multi_index_t

  std::array<int, dim> size_array;
  template<typename ... Args>
  multi_index_t(Args&& ... args) : size_array(std::forward<Args>(args) ...) 

  struct iterator
  
    struct sentinel_t ;
    std::array<int, dim> index_array = ;
    std::array<int, dim> const& size_array;
    bool _end = false;

    iterator(std::array<int, dim> const& size_array) : size_array(size_array) 

    iterator& operator++() 
    
      for (int i = 0;i < dim;++i)
      
        if (index_array[i] < size_array[i] - 1)
        
          ++index_array[i];
          for (int j = 0;j < i;++j)  index_array[j] = 0; 
          return *this;
        
      
      _end = true;
      return *this;
    
    std::array<int, dim>& operator*()   return index_array; 
    bool operator!=(sentinel_t) const  return !_end; 
  ;

  iterator begin() const  return iterator size_array ; 
  iterator end() const  return typename iterator::sentinel_t; 
;


template<typename ... index_t>
auto multi_index(index_t&& ... index) // <-- this doesn't compile

  static constexpr int size = sizeof ... (index_t); 
  auto ar = std::array<int, size>std::forward<index_t>(index) ...;
  return multi_index_t<size>(ar);

根据this answer,不能通过decltype()递归扩展可变参数函数模板。有任何想法吗?

【问题讨论】:

【参考方案1】:

C++11 不支持auto&amp; 类型返回。

所以你可以简单地明确类型。

对于multi_index(),你有返回一个multi_index_t&lt;size&gt;,其中sizesizeof...(index_t),所以你可以写

template<typename ... index_t>
multi_index_t<sizeof...(index_t)> multi_index(index_t&& ... index)

根据this answer,您不能通过decltype递归扩展可变参数函数模板。

正确,但我在您的 multi_index() 函数中看不到递归,所以我看不到如何在 decltype() 上应用递归。

如果你真的想要(但为什么?),你可以通过decltype() 显式返回类型,如下所示

template<typename ... index_t>
auto multi_index(index_t&& ... index)
   -> decltype( multi_index_t<sizeof...(index_t)>
                    std::array<int, sizeof...(index_t)>
                         std::forward<index_t>(index) ...   )

但我认为没有理由这样做,而不是简单地明确 multi_index_t&lt;sizeof...(index_t)&gt;

【讨论】:

这回答了我的问题。我一直专注于使用 decltype。谢谢马克斯

以上是关于在 C++11 中使用带参数包的 decltype的主要内容,如果未能解决你的问题,请参考以下文章

[C++11]decltype在泛型编程中的使用举例

[C++11]decltype类型推导规则

C++11新特性:3—— 汇总auto和decltype的区别

C++11新特性:3—— 汇总auto和decltype的区别

逐个使用C++11新特性

C++11之decltype类型推导(使用场景推导四规则cv限定符)