Шаблон карри с параметром из другого шаблона - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть класс 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

> {};

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

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

1 Ответ

0 голосов
/ 13 ноября 2018

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

typename BindFirst<Foo, A>::Result

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

BindFirst<Foo, A>::template Result

Живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...