使用部分特化从 boost:hana::set 中提取类型失败

Extracting types from boost:hana::set with partial specialization fails

我正在使用以下模板声明一组类型:

template<class ...T>
using DependencySet = boost::hana::set<boost::hana::type<T>...>;

我希望能够从集合中提取这些类型并放入另一个容器中。我尝试使用 "classic" 方法:

template<class ...T>
struct ExtractTypes;

template<class ...Dependencies>
struct ExtractTypes<DependencySet<Dependencies...>>
{
    using type = SomeOtherType<Dependencies...>;
};

唉,编译器不同意:

error: class template partial specialization contains a template parameter that cannot be deduced; this partial specialization will never be used [-Wunusable-partial-specialization]

struct ExtractTypes< DependencySet< Dependencies...>>

有没有办法从这样的集合中提取类型?

关于编译器错误,我认为这是不正确的,您可能使用的是旧版本的 Clang 或 GCC。

即使使用最新的编译器,您的代码也是不正确的,因为它对 hana::set 的模板参数进行了假设,这些参数被记录为 实现定义,因为 set 是一个无序的关联容器。

考虑使用允许更具表现力的代码的 "types as values" 方法,这正是 Boost.Hana 的目的。

要创建一个集合,请使用 hana::make_set, and to get the values back out you can use hana::unpack 调用可变函数对象及其包含的值(无特定顺序)。

这是一个例子:

#include <boost/hana.hpp>
#include <type_traits>

namespace hana = boost::hana;

template <typename ...T>
struct DependencySet { };

int main()
{
  auto deps = hana::make_set(
    hana::type<char>{}
  , hana::type<int>{}
  , hana::type<long>{}
  );

  auto dep_types = hana::unpack(deps, hana::template_<DependencySet>);

  static_assert(
    hana::typeid_(dep_types) == hana::type<DependencySet<char, int, long>>{}
  , ""
  );

}

顺便说一句,如果您只想将模板参数从一个模板放入另一个模板,请查看 Boost.Mp11 的 mp_apply