用另一个模板参数的模板模板

dir*_*lik 6 c++ templates metaprogramming currying

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

template<typename A, typename B>
struct Foo {};
Run Code Online (Sandbox Code Playgroud)

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

template<template<typename B> typename Foo>
struct Base {};
Run Code Online (Sandbox Code Playgroud)

Derived假设以下内容我想编写类:

  • Derived有一个模板参数(A)
  • Derived 扩展课程 Base
  • Derived作为模板参数传递给类BaseFoo,但有一个参数"currying"(A)

我怎样才能做到这一点?


这是我的(不工作)解决方案:

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

> {};
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

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

Hen*_*nke 2

该模板Base需要一个模板作为第一个参数,但您尝试传递依赖类型(由 指示typename),因此会出现错误消息。Result此外,内部的嵌套别名BindFirst是一个模板,因此需要一个模板参数才能与typename. 所以而不是

typename BindFirst<Foo, A>::Result
Run Code Online (Sandbox Code Playgroud)

你必须告诉编译器这Result实际上是一个模板,使用

BindFirst<Foo, A>::template Result
Run Code Online (Sandbox Code Playgroud)

实例