我正试图从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()
递归扩展可变参数函数模板。有任何想法吗?
答案 0 :(得分:0)
C ++ 11不支持
auto&
类型的返回。
因此您可以简单地显式类型。
对于multi_index()
,您将返回一个multi_index_t<size>
,其中size
是sizeof...(index_t)
,因此您可以编写
template<typename ... index_t>
multi_index_t<sizeof...(index_t)> multi_index(index_t&& ... index)
根据此答案,您无法通过
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<sizeof...(index_t)>