【发布时间】:2019-03-17 13:58:26
【问题描述】:
我正在尝试从一些可变参数类型列表中提取类型前缀。这是我的尝试:
#include <tuple>
#include <type_traits>
template <typename... Ts>
struct pack{};
template <size_t n, typename... Args>
struct prefix_tuple;
template <size_t n, typename... TPrefix, typename Tnext, typename... Ts>
struct prefix_tuple<n, pack<TPrefix...>, Tnext, Ts...>{
using type = typename
prefix_tuple<n-1, pack<TPrefix..., Tnext>, Ts...>::type;
};
template <typename... TPrefix, typename... Ts>
struct prefix_tuple<0, pack<TPrefix...>, Ts...>{
using type = std::tuple<TPrefix...>;
};
template <size_t n, typename... Args>
using prefix_tuple_t = typename
prefix_tuple<n, pack<>, Args...>::type;
bool f(){
return std::is_same_v<prefix_tuple_t<2, int, char, double>,
std::tuple<int, char> >;
}
这在 gcc 8.2 上失败了:
错误:'struct prefix_tuple, double>'的模版实例化不明确
第二个专业似乎比第一个更具体,所以我不明白为什么这里有歧义。 我做错了什么?
附:这在 clang 7.0 上也失败并出现类似错误,但似乎适用于 icc 19.0.1 和 msvc 19.16。
【问题讨论】:
-
如果我添加专业化,gcc/clang 版本可以工作:template
struct prefix_tuple,接下来,Ts...>{...};但是,加上这个,icc 无法编译。
标签: c++ metaprogramming