c++ - 带有提升模板的 hana::make_map

标签 c++ c++17 boost-hana

我正在尝试在编译时创建关键任务对的映射。键是一个序列号,它也应该用作映射任务类型内部的模板参数。我学到的是,我需要将我的 Task 提升到一个元函数中才能使其正常工作,但我在创建与我的模板参数匹配的正确 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 正在提示:

error: template template argument has different template parameters than its corresponding template template parameter

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

最佳 呜呜

最佳答案

hana::template_仅适用于 typename模板参数 - 它不支持非类型模板参数模板模板参数。参见 its implementation here .

这同样适用于 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_如您所愿。

关于c++ - 带有提升模板的 hana::make_map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50153211/

相关文章:

c++ - 更好的方法吗?新指针,需要删除吗?

c++ - 生成最快的可执行文件

c++ - 调试可变参数

c++ - 在 C++17 中,是否可以使用带有初始值设定项的 if 语句来解包可选?

c++ - 使用 boost::hana 创建一个大的编译时间映射

c++ - "Expected ' (' for function-style cast or type construction"错误是什么意思?

c++ - 工厂方法反if实现

c++ - 在 MoveAssignable 的情况下,标准对 self 移动赋值有何看法?

c++ - 将 `hana::string` 转换为 `constexpr const char (&)[]`

c++ - 模板模板的 hana 类型