【发布时间】:2018-06-07 21:51:23
【问题描述】:
考虑以下受this talk 启发的代码:
template<typename, typename...>
struct even_common_type_helper_impl;
template<std::size_t... Is, typename... Ts>
struct even_common_type_helper_impl<std::index_sequence<Is...>, Ts...>
{
template<std::size_t I>
using type_at = std::tuple_element_t<I, std::tuple<Ts...>>;
using even_common_type = std::common_type_t<type_at<2 * Is>...>;
};
template<typename... Ts>
using even_common_type_helper =
even_common_type_helper_impl<std::make_index_sequence<sizeof...(Ts) / 2>, Ts...>;
template<typename... Ts>
using even_common_type = typename even_common_type_helper<Ts...>::even_common_type;
基本上,我得到一个模板类型参数包,并尝试提取位于此包中偶数位置的所有类型的通用类型。
上面的代码适用于 gcc 8.1 和 clang 6.0,但在最新的 MSVC 版本中失败,并出现以下错误:
错误 C2971:“std::tuple_element_t”:模板参数“_Index”:“I”:具有非静态存储持续时间的变量不能用作非类型参数
我错过了这里的任何重要细节还是只是另一个 MSVC 错误?
【问题讨论】: