最近,我遇到了一种基于数据类型的“概念”的调度模式(我认为这是对术语概念的正确使用,如果没有,则指属性?)。
在我看来,它比以前(至少在优化之前)介绍的事物类型涉及更多,它引入了临时变量和函数调用。我的问题是(1)这一切实际上是否已被优化? (2)这是进行这种基于类型的调度的“最佳”方法吗?
我正在阅读的代码处理的是迭代器类型,因此我将坚持使用它作为模式的示例。下面的iter_kind
函数采用任何类型的变量,并返回特定“概念”类型的虚拟变量。类似于random_access_iterator_kind
,或者如果_Iter
是非迭代器,则键入null_iterator_kind
。
template <typename _Iter>
INLINE_CALL typename iterator_traits<_Iter>::iter_kind iter_kind(_Iter&)
{
typename iterator_traits<_Iter>::iter_kind _ret;
return ( _ret );
}
它通过
iterator_traits
类的特殊化,使用通常的meta-magic进行工作。我对所有这些东西都很满意。iter_kind
用于委派特定功能的不同实现,例如:template <typename _Iter, typename _Pred>
_Iter binary_search(_Iter head, _Iter tail, _Pred pred_less)
{
binary_search_impl(head, tail, pred_less, iter_kind(head));
}
template <typename _Iter, typename _Pred>
_Iter binary_search_impl(_Iter head, _Iter tail, _Pred pred_less,
random_access_iterator_kind)
{ // actual implementation...
}
template <typename _Iter, typename _Pred>
_Iter binary_search_impl(_Iter head, _Iter tail, _Pred pred_less,
bidirectional_iterator_kind)
{
assert(false); // can't do bin search without random access iters!!
}
最佳答案
是的,所有这些东西实际上都已得到优化。编译器专门为消除这种麻烦而编写,因为这是一个常见的技巧。之所以可以完成函数和重载,是因为它比其他任何一种方法都容易得多。这是在标准库的实现中使用的常见技巧。
关于c++ - 模板超魔术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5920723/