6

以下将类型转换应用于类型F列表:CE...

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 Tapply. 但是,如果我将它嵌入到 的定义中,仍然可以正常工作apply,即typedef C <const E...> type

另一方面,一切都按预期在clang中工作。我可能遗漏了一些东西,但对我来说这确实像是一个 gcc 错误。

有任何想法吗?

4

1 回答 1

1

这是一个完整但简化的测试用例,您可能希望将其添加到 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任何其他头文件)。

于 2013-09-16T13:37:52.853 回答