4

我正在尝试实现 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::???>;

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

4

1 回答 1

7

我不知道 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; };
于 2013-05-20T11:16:38.647 回答