gpt4 book ai didi

c++ - 模板函数用于包装 C++ 中传递给它的任何函数

转载 作者:行者123 更新时间:2023-12-02 18:08:57 25 4
gpt4 key购买 nike

我正在尝试使用 libgit2,并且认为用一些能为我抛出异常的东西来包装调用会很好。我的理念是,我将能够调用具有公共(public)返回类型的函数。我想我可以使用模板化函数来完成它,但我遇到了一些问题:

template<typename F, typename... Args>
inline void invoke(Args&&... args) {
git_error_code errCode = F(std::forward<Args>(args)...);
if (errCode != GIT_OK) {
throw GitErrorException(errCode);
}
}

这生成了一些编译器警告,指出我没有使用有效类型,因此我认为我也可以使用别名:

template<typename ... Args>
using F = int (*)(Args&&... args);

template<F f, typename... Args>
inline void invoke(Args&&... args) {
git_error_code errCode = f(std::forward<Args>(args)...);
if (errCode != GIT_OK) {
throw GitErrorException(errCode);
}
}

但是当使用如下代码时,这也不起作用:

Git::invoke<git_branch_name>(&name, _ref);

我真的应该在这里依赖宏吗?

最佳答案

具有以下语法

Git::invoke<git_branch_name>(&name, _ref);

您需要 (C++17)

template<auto F, typename... Args>
void invoke(Args&&... args) {
git_error_code errCode = F(std::forward<Args>(args)...);
if (errCode != GIT_OK) {
throw GitErrorException(errCode);
}
}

对于 c++14,你可以这样做

template<typename F, typename... Args>
void invoke(F f, Args&&... args) {
git_error_code errCode = f(std::forward<Args>(args)...);
if (errCode != GIT_OK) {
throw GitErrorException(errCode);
}
}

使用情况

Git::invoke(&git_branch_name, &name, _ref);

关于c++ - 模板函数用于包装 C++ 中传递给它的任何函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72698375/

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