hana :: make_map с поднятым шаблоном - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать карту пар ключ-задача во время компиляции. Ключ - это порядковый номер, который также должен использоваться в качестве параметра шаблона внутри сопоставленных типов задач. Что я узнал, так это то, что мне нужно поднять мою задачу в метафункцию, чтобы она работала, но у меня уже возникают проблемы с созданием правильного hana::types, соответствующего параметрам моего шаблона.

Это то, что я имею до сих пор:

template <std::size_t Key,
          typename T = double,
          template<typename...> class Complex = std::complex>
class Task
{
    ...
}

template <std::size_t Begin,
          std::size_t End,
          typename T,
          template<typename...> class Complex = std::complex>
class TaskFactory
{
    static constexpr auto create(void)
    {
        auto keys = hana::make_range(hana::int_c<Begin>, hana::int_c<End>);

        return hana::unpack(keys, [](auto... key)
        {
            return hana::make_map(hana::make_pair(key, hana::template_<Task>(hana::type_c<key>, hana::type_c<T>, hana::type_c<Complex>)())...);
        });
    }

    static constexpr auto taskMap_ = create();

    ...
}

int main()
{
    TaskFactory<2, 8, double, std::complex> myTaskFactory;
    return 0;
}

Кланг жалуется на:

ошибка: аргумент шаблона шаблона имеет параметры шаблона, отличные от соответствующего параметра шаблона

Что я делаю неправильно, и это правильный подход?

Лучший Плетеные

1 Ответ

0 голосов
/ 03 мая 2018

hana::template_ работает только с typename параметрами шаблона - он не поддерживает нетипичные параметры шаблона или параметры шаблона . См. его реализацию здесь .

То же самое относится к hana::type_c.

  • hana::type_c<key> недопустимо, поскольку key не является типом.

  • hana::type_c<Complex> недопустимо, поскольку Complex не является типом.

Ваш подход до hana::unpack(keys, [](auto... key) выглядит хорошо для меня. Вам нужно изменить класс Task, чтобы он определялся в терминах типов - например ::

template <typename Key,
          typename Complex>
class Task
{
    // ...
};

Таким образом, вы можете использовать hana::template_, как намереваетесь.

...