【问题标题】:Finding the best match using metaprogramming technique使用元编程技术找到最佳匹配
【发布时间】:2019-11-29 07:12:57
【问题描述】:

我正在调查模板中表示的最佳匹配算法,完整指南 实现如下

template<typename List>
class FrontT;

template<typename Head, typename... Tail>
class FrontT<Typelist<Head, Tail...>>
{
 public:
  using Type = Head;
};

template<typename List>
using Front = typename FrontT<List>::Type;
 template<typename List>
class PopFrontT;

template<typename Head, typename... Tail>
class PopFrontT<Typelist<Head, Tail...>> {
 public:
  using Type = Typelist<Tail...>;
};

template<typename List>
using PopFront = typename PopFrontT<List>::Type;
template<typename List>
class LargestTypeT;

// recursive case:
template<typename List>
class LargestTypeT
{
 private:
  using First = Front<List>;
  using Rest = typename LargestTypeT<PopFront<List>>::Type;
 public:
  using Type = IfThenElse<(sizeof(First) >= sizeof(Rest)), First, Rest>;
};

// basis case:
template<>
class LargestTypeT<Typelist<>>
{
 public:
  using Type = char;
};

template<typename List>
using LargestType = typename LargestTypeT<List>::Type;

我很难理解的是下面一行

using Type = IfThenElse<(sizeof(First) >= sizeof(Rest)), First, Rest>;

很明显FirstTypeList中的第一个元素,sizeof是这个类型的大小。但我对Rest 感到困惑。 Rest 的大小是多少? Rest 它是一个列表,其中包含 typelist 中包含的其余元素。

例如,如果定义如下

LargestType<TypeList<int,bool,char>>

在第一个循环中 Firstintsizeof 是 4 Restbool,charsizeof 是什么? 在第二个循环中 Firstboolsizeof 是 1 Restcharsizeof 是 1

【问题讨论】:

    标签: c++ templates recursion variadic-templates template-meta-programming


    【解决方案1】:

    休息的大小是多少? Rest 它是一个列表,其中包含 typelist 中包含的其余元素。

    不,Rest(名字有点不好)实际上不是列表的其余部分,而是列表其余部分中最大的类型,从它的定义可以看出:

    using Rest = typename LargestTypeT<PopFront<List>>::Type;
    

    【讨论】:

    • 但在第一次递归中,Rest = LargestTypeT::Type 。这是对的吗?并递归地再次调用 LargestTypeT 。我在第一个循环中的问题是如何评估 IfThenElse statememt?
    • LargestTypeT&lt;bool, char&gt;::Typebool。我不确定你在问什么。
    【解决方案2】:

    我与其他人混淆了。休息的大小是多少? Rest 它是一个列表,其中包含 typelist 中包含的其余元素。

    Rest的定义

    using Rest = typename LargestTypeT<PopFront<List>>::Type;
    

    RestList中最大的类型,不包括(PopFront)第一类型(First)。

    在第一个循环中,首先是 int,sizeof 是 4,其余是 bool,char,sizeof 是多少?在第二个循环中 First 是 bool 并且 sizeof 是 1 Rest 是 char 并且 sizeof 是 1

    不完全是。

    在第一个循环中,FirstintRestbool

    在第二个循环中(第一个循环的Rest 被选为boolFirstboolRestchar

    在第三个循环中(第二个循环的Rest 被选为charFirstcharRestchar

    在第四个循环中,您有基本情况(或基本情况,根据您的喜好)

    template<>
    class LargestTypeT<Typelist<>>
    {
     public:
      using Type = char;
    };
    

    选择Type(第三个循环中的Rest)作为char

    【讨论】:

    • 为什么在第一个循环中 Rest 是 bool。我的印象是 LargestType 将被调用,直到所有元素都被删除。在最后一步中,int 将与 char 进行比较。我还没有理解算法是如何工作的。
    • @getsoubl - 在第一个循环中Restbool 因为在第二个循环中FirstboolRestchar 所以sizeof(First) 等于sizeof(Rest) (都是 1)所以 sizeof(First) &gt;= sizeof(Rest)true 所以在 using Type = IfThenElse&lt;(sizeof(First) &gt;= sizeof(Rest)), First, Rest&gt;; First (bool) 被选中。
    猜你喜欢
    • 2018-08-24
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2021-11-17
    • 1970-01-01
    • 2014-08-26
    • 2023-03-25
    相关资源
    最近更新 更多