【发布时间】:2015-08-17 08:57:57
【问题描述】:
有人可以解释一下 cppreference 网站的示例中的几点吗? 该技术描述了函数重载取决于迭代器类型。 前两个带有“使用”的 typedef 很容易理解。 这些问题与 alg 函数有关:
- 在模板参数列表中-“typename = ...”没有参数名称,这是否意味着在函数调用中使用默认值无法覆盖它?
-
我是否理解第二个模板参数的使用正确 - 只有在传递的迭代器类型和预期的迭代器标记的类型相等的情况下才会生成函数?
- 您能否解释一下在第二个函数 alg 中使用第三个模板参数以及那里的注释:
"typename = void> // 虚拟值以避免模板重新定义错误 "
这段代码在这里(http://en.cppreference.com/w/cpp/iterator/iterator_tags):
template<typename Condition, typename T = void>
using EnableIf_t = typename std::enable_if<Condition::value, T>::type;
template<typename Iterator, typename IteratorTag>
using IsSameIteratorCond =
std::is_same<IteratorTag,
typename std::iterator_traits<Iterator>::iterator_category>;
template<
typename BDIter,
typename = EnableIf_t<IsSameIteratorCond<BDIter, std::bidirectional_iterator_tag>>>
void alg(BDIter, BDIter)
{
std::cout << "alg() called for bidirectional iterator\n";
}
template<
typename RAIter,
typename = EnableIf_t<IsSameIteratorCond<RAIter, std::random_access_iterator_tag>>,
typename = void> // dummy value to avoid template re-definition error
void alg(RAIter, RAIter)
{
std::cout << "alg() called for random-access iterator\n";
}
int main()
{
std::vector<int> v;
alg(v.begin(), v.end());
std::list<int> l;
alg(l.begin(), l.end());
}
【问题讨论】:
标签: c++ templates template-meta-programming