我正在浏览一些模板示例代码,这是我无法获得的一件事。
采用模板方法:
template<class Seq, class T, class R>
void apply(Seq &sq, R(T::*f)() const) {
typename Seq::iterator it = sq.begin();
while(sq.end() != it) {
((*it++)->*f)();
}
}
示例类:
class MyClass {
public:
MyClass() {}
void doSomething() const {
std::cout << "doing stuff..." << std::endl;
}
};
测试代码:
void testMyClass() {
vector<MyClass*> v;
for(size_t i = 0; i < 5; ++i) {
v.push_back(new MyClass());
}
// call a member methode on all elements in container
apply(v, &MyClass::doSomething);
}
如果有人能够解释我class R
对于模板定义中定义的是什么,我将不胜感激?
答案 0 :(得分:2)
class R
用于推断函数的返回类型。在您的情况下,它被推断为void
类型。
答案 1 :(得分:2)
class R
指的是传递给函数apply
的函数指针的返回类型。它是从实际传递的函数指针类型中自动推导出来的,所以在调用apply
时你永远不需要关心它。
apply
的实现会丢弃函数的返回值,因此您可以简单地强制传递的函数返回void
:
template<class Seq, class T>
void apply(Seq &sq, void(T::*f)() const) {
typename Seq::iterator it = sq.begin();
while(sq.end() != it) {
((*it++)->*f)();
}
}
但是,现在您将调用站点限制为仅传递此类函数指针。遗憾的是,指向返回某个函数的函数的指针并非可以转换为不可转换的函数,尽管它非常“直观”。
因此,当您将函数指针作为参数并且不关心返回类型时,最好接受“any”返回类型而不是“none”。