我正在阅读一些库源文件,阅读完代码后我可以看到它的内容。这不是问题。实际上确实没有任何问题,但我越是开始使用模板并阅读这些文档;一些模式正在变得视觉上可识别。
代码有这种模式......
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的内部静态方法。
我想知道更好的理解,以便当我开始更频繁地看到和识别这样的模式时;然后我知道该怎么称呼他们。这种模式是否有首选的通用名称?我知道类或结构是专门的并在包装函数模板中调用,但这不是我所指的。例如,某些类型的代码模式称为SFINAE
或Tag Dispatching
等等......我知道这可能是一些简单的东西,我忽略了但不知道通常称之为什么我看到它的模式类型。我并不真正关心implementation
本身的static methods
详细信息,因为这涉及到所有模板特化的实际整体模式,然后由函数模板包装器调用用户。
修改
虽然我仍然对上述问题的答案很有兴趣,但我也考虑过以下几点......
考虑到我以这种方式提出了一个问题:我认为这对整个社区来说可能是值得的,也是有益的。我的建议是这样的:如果你知道任何特定的众所周知的可区分代码模式,你可以显示他们众所周知的名称,展示一个坚实的例子,简要说明他们的共同用途,并最终列出他们的优点和缺点,如这里的答案。我认为,如果他们需要知道任何不同的常见代码模式在视觉上是什么样的,那么这对于每个人来说都是一个很好的参考Q / A.如果模式名称是缩写,首字母缩写等可以显示如SFINAE
,但我认为显示其完整的专有名称也是有用的:Substitution Failure Is Not An Error
在发布的答案中的某些位置。我很想知道这篇文章将如何随着时间的推移而扩展和发展。