我试图从第二个答案获得multi_index_t
代码here由davidhigh回答使用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不支持
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)>