以下将类型转换应用于类型F
列表:C
E...
template <template <typename...> class F, typename P> struct apply_t;
template <
template <typename...> class F,
template <typename...> class C, typename... E
> struct apply_t <F, C <E...> > { typedef C <F <E>...> type; };
template <template <typename...> class F, typename P>
using apply = typename apply_t<F, P>::type;
现在,给出这个输入:
template <typename T> using map1 = T*;
template <typename T> using map2 = const T;
template <typename T> using map3 = const T*;
我在 gcc 4.8.1 中得到以下输出,例如std::tuple
:
apply <map1, tuple <int, char> > // -> tuple <int*, char*> (OK)
apply <map2, tuple <int, char> > // -> tuple <int, char>
// (tuple <const int, const char> expected)
apply <map3, tuple <int, char> > // -> tuple <const int*, const char*> (OK)
我可以使用调用static_assert()
.
我尝试过各种组合。当作为输入类型映射const T
到apply
. 但是,如果我将它嵌入到 的定义中,仍然可以正常工作apply
,即typedef C <const E...> type
。
另一方面,一切都按预期在clang中工作。我可能遗漏了一些东西,但对我来说这确实像是一个 gcc 错误。
有任何想法吗?