以下适用类型转换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
当将map作为输入类型map给出时,除map之外的所有东西都可以工作apply
。但是如果我将它嵌入到的定义中apply
,还是可以的,即typedef C <const E...> type
。
另一方面,一切都在clang中按预期工作。我可能遗漏了一些东西,但对我来说确实好像是一个gcc错误。
有任何想法吗?
这是一个完整但精简的测试用例,您可能要将其添加到GCC错误报告中(如果需要编写一个):
template< typename T > using Map = const T;
template< template<typename> class M, typename T >
struct Apply;
template< template<typename> class M, template<typename...> class C, typename... Ts >
struct Apply< M, C<Ts...> > { typedef C<M<Ts>...> type; };
template< typename T > struct A {};
template<typename> void dummy();
int main()
{
dummy< Apply<Map,A<int>>::type >();
}
将由于以下原因而无法链接
undefined reference to `void dummy<A<int> >()'
而不是预期的
undefined reference to `void dummy<A<const int> >()'
(我知道这不能解决问题,但是GCC的人们可能会更喜欢简化的测试用例,而不依赖于std::tuple
任何其他标头)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句