模板功能以包装C++

发布于 2025-02-09 09:22:29 字数 943 浏览 0 评论 0原文

我正在尝试使用libgit2,并认为将通话包裹起来会给我带来例外的东西是很不错的。我的理念是,我将能够调用具有共同回报的功能。我认为我可以使用模板功能来完成此操作,但是我遇到了一些问题:

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

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

I am trying to use libgit2, and thought it would be nice to wrap the calls with something that will throw an exception for me instead. My philosophy was that I would then be able to invoke functions that have a common return typ. I figured I would be able to do it with a templated function but I am running into some issues:

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

This generated some compiler warnings that I was not using a valid type so I figured that I could also use an alias instead:

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

But that also did not work when using the code as follows:

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

Should I really have to rely on a macro instead here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

皇甫轩 2025-02-16 09:22:29

要具有以下语法

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

To have following syntax

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

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

For c++14, you might do instead

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

with usage

Git::invoke(&git_branch_name, &name, _ref);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文