用另一个模板中的参数来固化模板

时间:2018-11-12 22:09:19

标签: c++ templates metaprogramming currying

我有一个类Foo,它有两个模板参数AB

template<typename A, typename B>
struct Foo {};

我还有类Base,它具有一个模板模板参数:

template<template<typename B> typename Foo>
struct Base {};

我想假设以下情况,编写类Derived

  • Derived有一个模板参数(A
  • Derived扩展了类Base
  • Derived作为模板参数传递给类BaseFoo,但带有一个参数“ currying”(A

我该怎么做?


这是我的(not working)解决方案:

template<template<typename B> typename Foo>
struct Base {};

template<typename A, typename B>
struct Foo {};

template<template<typename A, typename B> typename Foo, typename A>
struct BindFirst {
    template<typename B>
    using Result = Foo<A, B>;
};

template<typename A>
struct Derived : Base<

        // error is here
        typename BindFirst<Foo, A>::Result

> {};

哪个给我错误:

  模板模板参数的

template参数必须是类模板或类型别名模板

1 个答案:

答案 0 :(得分:2)

模板Base期望模板作为第一个参数,但是您尝试传递从属类型(由typename表示),因此出现错误消息。此外,Result中的嵌套别名BindFirst是模板,因此需要与typename一起使用的模板参数。所以代替

typename BindFirst<Foo, A>::Result

您必须使用

告诉编译器Result实际上是模板
BindFirst<Foo, A>::template Result

Live example