为 C++11 使用带有参数包的 decltype
using decltype w/ parameter pack for C++11
我正在尝试从 davidhigh 回答的第二个答案 中获取 multi_index_t
代码以使用 C++11。 C++11 不支持 auto&
类型 returns.
我将 return 类型转换为 class,但我不明白 how/if 不使用 C++ 也可以支持辅助函数 multi_index()
14.
代码:
#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 does not support auto&
type returns.
因此您可以简单地明确类型。
对于multi_index()
你有return一个multi_index_t<size>
,其中size
是sizeof...(index_t)
,所以你可以写
template<typename ... index_t>
multi_index_t<sizeof...(index_t)> multi_index(index_t&& ... index)
According to this answer, you can't recursively expand the variadic function template via decltype
.
正确,但我没有在您的 multi_index()
函数中看到递归,所以我没有看到如何在 decltype()
.
上应用递归
如果你真的想要(但为什么?),你可以通过 decltype()
显式 returning 类型,如下所示
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)>
我正在尝试从 davidhigh 回答的第二个答案 multi_index_t
代码以使用 C++11。 C++11 不支持 auto&
类型 returns.
我将 return 类型转换为 class,但我不明白 how/if 不使用 C++ 也可以支持辅助函数 multi_index()
14.
代码:
#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 does not support
auto&
type returns.
因此您可以简单地明确类型。
对于multi_index()
你有return一个multi_index_t<size>
,其中size
是sizeof...(index_t)
,所以你可以写
template<typename ... index_t>
multi_index_t<sizeof...(index_t)> multi_index(index_t&& ... index)
According to this answer, you can't recursively expand the variadic function template via
decltype
.
正确,但我没有在您的 multi_index()
函数中看到递归,所以我没有看到如何在 decltype()
.
如果你真的想要(但为什么?),你可以通过 decltype()
显式 returning 类型,如下所示
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)>