【问题标题】:using decltype w/ parameter pack for C++11在 C++11 中使用带参数包的 decltype
【发布时间】: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()递归扩展可变参数函数模板。有任何想法吗?

【问题讨论】:

    标签: c++11 templates variadic-templates variadic-functions auto


    【解决方案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。谢谢马克斯
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多