Шаблон карри с параметром из другого шаблона

у меня урок Foo, который имеет два параметра шаблона, A а также B:

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

Также у меня есть класс Base, который имеет один параметр шаблона шаблона:

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

Я хочу написать класс Derived предполагая следующее:

  • Derived имеет один параметр шаблона (A)
  • Derived расширяет класс Base
  • Derived передает в качестве параметра шаблона класс Base учебный класс Foo, но с одним параметром «curry» (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

> {};

Что дает мне ошибку:

Аргумент шаблона для параметра шаблона должен быть шаблоном класса или псевдонимом типа

6

Решение

Шаблон Base ожидает шаблон в качестве первого параметра, но вы пытаетесь передать зависимый тип (обозначенный как typename), отсюда и сообщение об ошибке. Более того, вложенный псевдоним Result внутри BindFirst является шаблоном и поэтому требует использования параметра шаблона для использования с typename, Так что вместо

typename BindFirst<Foo, A>::Result

Вы должны сказать компилятору, что Result на самом деле шаблон, используя

BindFirst<Foo, A>::template Result

Живой пример

2

Другие решения

Других решений пока нет …