在 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&
类型返回。
所以你可以简单地明确类型。
对于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)
根据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<sizeof...(index_t)>
【讨论】:
这回答了我的问题。我一直专注于使用 decltype。谢谢马克斯以上是关于在 C++11 中使用带参数包的 decltype的主要内容,如果未能解决你的问题,请参考以下文章
C++11新特性:3—— 汇总auto和decltype的区别