最近,我遇到了一种基于数据类型的“概念”的调度模式(我认为这是对术语概念的正确使用,如果没有,则指属性?)。

在我看来,它比以前(至少在优化之前)介绍的事物类型涉及更多,它引入了临时变量和函数调用。我的问题是(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/

10-11 18:25