【发布时间】:2011-09-14 10:26:59
【问题描述】:
我的假设是(可能不正确)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 }
【问题讨论】:
-
在你进入模板和迭代器之前,你应该先看看函数覆盖。基于参数类型具有覆盖“调度”的所有函数。
-
@selalerer:你的意思是“过载”,而不是“覆盖”。
标签: c++ polymorphism dispatch