0

我正在尝试在编译时创建键任务对的映射。键是一个序列号,它也应该用作映射任务类型内的模板参数。我学到的是,我需要将我的任务提升到一个元函数中才能完成这项工作,但是在创建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;
}

Clang 抱怨:

错误:模板模板参数的模板参数与其对应的模板模板参数不同

我做错了什么,这是正确的方法吗?

最好的吴姆

4

1 回答 1

1

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_按照自己的意愿使用。

于 2018-05-03T11:00:50.933 回答