识别C ++模板代码模式

时间:2018-01-28 04:14:35

标签: c++ templates design-patterns c++17 template-specialization

    下面描述的模式类型是否有首选的通用名称?

我正在阅读一些库源文件,阅读完代码后我可以看到它的内容。这不是问题。实际上确实没有任何问题,但我越是开始使用模板并阅读这些文档;一些模式正在变得视觉上可识别。

代码有这种模式......

template<typename T, typename U, 
    bool is_T_signed = integer_traits<T>::is_signed,
    bool is_U_signed = integer_traits<U>::is_signed>
struct foo_impl {};

template<typename T, typename U>
struct foo_impl<T, U, true, true> {
    static T run( U x ) {
        return ( (x <= /*some max value */ ) && 
                 (x >= /*some min value */ ) );
    }
};

template<typename T, typename U>
struct foo_impl<T, U, false, false> {
    static T run( U x ) {
        return x <= /*some max value*/;
    }
};

template<typename T, typename U>
struct foo_impl<T, U, true, false> {
    static T run( U x ) {
        if ( sizeof( T ) > sizeof( U ) )
            return 1;
        else
            return x <= U( /*some max value*/ );
    }
};

template<typename T, typename U>
struct foo_impl<T, U, false, true> {
    static T run( U x ) {
        if ( sizeof( T ) >= sizeof( U ) )
            return x >= 0;
        else
            return (x >= 0) && (x <= U( /*some max value*/ ));
    }
};

template<typename T, typename U> inline T foo( U x ) {
    return foo_impl<T, U>::run( x );
}

只需简单地了解代码的目的即可。

  
      
  • 包含<T,U,bool = default, bool = default>参数的空类模板
  •   
  • 所有4种组合的专精术[t,t][f,f][t,f][f,t]
  •   
  • 他们每个都返回T并接受U作为其成员函数的参数,并且该函数是静态类型。
  •   
  • 这些都附加在结构末尾的impl,引用从implementation抽象出来的user
  •   
  • 最后一个函数模板,它接受<T,U>参数并返回或调用struct的内部静态方法。
  •   

我想知道更好的理解,以便当我开始更频繁地看到和识别这样的模式时;然后我知道该怎么称呼他们。这种模式是否有首选的通用名称?我知道类或结构是专门的并在包装函数模板中调用,但这不是我所指的。例如,某些类型的代码模式称为SFINAETag Dispatching等等......我知道这可能是一些简单的东西,我忽略了但不知道通常称之为什么我看到它的模式类型。我并不真正关心implementation本身的static methods详细信息,因为这涉及到所有模板特化的实际整体模式,然后由函数模板包装器调用用户。

修改

虽然我仍然对上述问题的答案很有兴趣,但我也考虑过以下几点......

考虑到我以这种方式提出了一个问题:我认为这对整个社区来说可能是值得的,也是有益的。我的建议是这样的:如果你知道任何特定的众所周知的可区分代码模式,你可以显示他们众所周知的名称,展示一个坚实的例子,简要说明他们的共同用途,并最终列出他们的优点和缺点,如这里的答案。我认为,如果他们需要知道任何不同的常见代码模式在视觉上是什么样的,那么这对于每个人来说都是一个很好的参考Q / A.如果模式名称是缩写,首字母缩写等可以显示如SFINAE,但我认为显示其完整的专有名称也是有用的:Substitution Failure Is Not An Error在发布的答案中的某些位置。我很想知道这篇文章将如何随着时间的推移而扩展和发展。

0 个答案:

没有答案