gpt4 book ai didi

c++ - 需要澄清 C++ 模板格式

转载 作者:行者123 更新时间:2023-11-30 01:50:59 25 4
gpt4 key购买 nike

我正在浏览一些模板示例代码,但有一件事我没有明白。

采用模板方法:

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 的用途,我将不胜感激?

最佳答案

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)();
}
}

但是,现在您将调用站点限制为仅传递此类函数指针。可悲的是,指向返回某些内容的函数的指针不能隐式转换为不返回某些内容的函数,尽管它非常“直观”。

所以当你将一个函数指针作为参数时,你不关心返回类型,接受“任何”返回类型比“无”更好。

关于c++ - 需要澄清 C++ 模板格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com