我正在尝试实现 loki 类型列表的可变参数模板包装器。

以 loki 样式合并两个类型列表很容易,但我在可变参数模板样式中遇到合并问题。

这是我的实现(简化,没有 push_back , index_of , ... ,方法)。

template<typename... Ts>
struct dl32TypeList;

template<typename HEAD , typename... TAIL>
struct dl32TypeList<HEAD,TAIL...>
{
    static const unsigned int size = sizeof...(TAIL) + 1;

    using value = dl32Loki_like_TypeList<HEAD, typename dl32TypeList<TAIL...>::value>;
};

template<>
struct dl32TypeList<>
{
    using value = dl32NoType;

    static const unsignedint size = 0;
};

我想要这样的东西:
template<typename OTHER_TYPELIST>
using merge = dl32TypeList<HEAD , TAIL... , typename OTHER_TYPELIST::???>;

这就是问题所在:我们不能将可变参数模板 args 存储为 using/typedef,所以我对如何做到这一点有任何想法。 (注意 OTHER_TYPELIST::???)。

最佳答案

我不知道 Loki 或 DL32 是什么,也不清楚您是否应该实现任何东西。
std::tuple 是类型列表的常用工具。它被设计为运行时存储容器,但只要类型完整,它就可以作为编译时实用程序工作。这是连接元组的一种方法:

template< typename ... t >
struct tuple_cat
    { typedef decltype( std::tuple_cat( std::declval< t >() ... ) ) type; };

如果您想手动完成,请尝试部分特化:
template< typename ... t >
struct type_list {};

template< typename ta, typename tb >
struct type_cat;

template< typename ... a, typename ... b >
struct type_cat< type_list< a ... >, type_list< b ... > >
    { typedef type_list< a ..., b ... > type; };

至于 size 成员,你可以做一个通用的元函数来一劳永逸地解决问题。
template< typename >
struct count_types;

template< template< typename ... > class t, typename ... a >
struct count_types< t< a ... > >
    { static constexpr std::size_t value = sizeof ... a; };

10-07 21:20