gpt4 book ai didi

c++ - 将成员函数指针作为模板参数传递

转载 作者:太空狗 更新时间:2023-10-29 20:01:57 25 4
gpt4 key购买 nike

我想创建一个包装类,它能够在模板的帮助下调用包装类的成员函数(任何类型)。这是我目前所拥有的:

template <typename T>
class wrapper {
public:
template<typename R, R (T::*func)()>
void call_func() {
(wrapped.*func)();
}

private:
T wrapped;
};

class some_class {
private:
int i = 2;
public:
void some_func() {
std::cout << i << std::endl;
}
};

int main() {
wrapper<some_class> wr;
// How I need to call at the moment:
wr.call_func<void, &some_class::some_func>();
// How I want call:
wr.call_func<&some_class::some_func>();
return 0;
}

正如您在 main 函数的注释中看到的,我想调用包装函数而不显式指定包装成员函数的返回类型。 (如何)这可以在 C++11 中完成吗?

最佳答案

template<typename F>
void call_func(F func) {
(wrapped.*func)();
}

然后像这样调用:

wr.call_func(&some_class::some_func);

如果你也想使用返回值,你需要这个:

template<typename F>
auto call_func(F func) -> decltype((std::declval<T>().*func)()) {
return (wrapped.*func)();
}

如果你有 C++14,你可以省略 ->decltype(...) 部分并使用 decltype(auto) 作为返回值。

如果你还想传递函数,你可以使用可变参数模板和转发。

template<typename F, typename... Args>
decltype(auto) call_func(F func, Args&&... args) {
return (wrapped.*func)(std::forward<Args>(args)...);
}

关于c++ - 将成员函数指针作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48949244/

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