需要澄清C ++模板格式

时间:2014-11-03 22:26:23

标签: c++ templates stl

我正在浏览一些模板示例代码,这是我无法获得的一件事。

采用模板方法:

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对于模板定义中定义的是什么,我将不胜感激?

2 个答案:

答案 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”。