我处于(可能不正确的)假设下,即 C++ 中的非成员函数不会根据其参数的类型进行分派。但是在阅读了iterator_category
它之后,我似乎可以根据其参数的类别类型调用一个函数,并且该调用还处理继承。例如,如果我只编写随机访问迭代器和输入迭代器的实现,那么所有使用非随机访问迭代器的调用都将转到接受输入迭代器的函数。这是书中的一个简短示例
template <class T>
foo(T a) {
foo(a, iterator_traits<T>::iterator_category());
}
template <class T>
foo(T a, random_access_iterator_tag) { \\body}
template <class T>
foo(T a, input_iterator_tag) { \\body}
// presumably this works even for
// ostream_iterator<int> i(cout);
// foo(i);
这种调度是普遍正确的还是特殊情况?
如果我的实现不是详尽无遗的,例如在基于迭代器类别的示例中,如果我只给出了随机访问迭代器和双向迭代器的实现,编译器是否应该警告我,如果编译器抱怨输出迭代器没有被覆盖。
这也是我第一次遇到一个函数的参数只是一个类型,而不是一个对象/实例。那么我可以在不指定该类型的实例/对象的名称的情况下将具有内置或用户定义类型的函数定义为其参数之一吗?
以下似乎是 CRTP 的替代方案,以实现编译时多态性。这是正确的解释吗
template<class T>
int foo(T a) {
foo(a, a::type());
}
int foo(int a, base) { \\body }
int foo(int a, derived) { \\body }