gpt4 book ai didi

c++ - 接受带有 X 参数的可调用仿函数的模板函数

转载 作者:行者123 更新时间:2023-11-30 02:55:17 25 4
gpt4 key购买 nike

我正在编写一个托管的 C++ 程序,该程序运行用户编写的动态编译的 C 代码。从 C 代码中捕获并处理/忽略某些典型异常是绝对重要的。为此,我从结构化异常处理 block 中调用 C 代码。由于这个 block 的性质和语义(以及调用它的地方),我将实际调用它自己的函数分开:

    template <typename ret_type, class func>
static ret_type Cstate::RunProtectedCode(func function) {
ret_type ret = 0;
__try {
ret = function();
}
__except(ExceptionHandler(GetExceptionCode(), ExceptionStatus::CSubsystem)) {
fprintf(stderr, "First chance exception in C-code.\n");
}
return ret;
}

它工作得很好,因为它应该是这样的:

        RunProtectedCode<int>(entry);

但是是否可以调整它以便我可以调用具有可变数量参数的函数 - 可能通过使用一些奇异的仿函数(唯一的要求显然是它不能有析构函数)?我正在使用 MSVC++ 2010。

最佳答案

如果您可以使用 C++11,则可以使用可变参数模板实现这一点。

template <typename ret_type, class func, typename... Args>
static ret_type Cstate::RunProtectedCode(func function, Args&&... args) {
ret_type ret = 0;
__try {
ret = function(std::forward<Args>(args)...);
}
__except(ExceptionHandler(GetExceptionCode(), ExceptionStatus::CSubsystem)) {
fprintf(stderr, "First chance exception in C-code.\n");
}
return ret;
}

你可以这样调用它

RunProtectedCode<int>(entry2, 1, 2);
RunProtectedCode<int>(entry3, 1, "a", 3);

您可以通过使用 std::function 来简化它(有点)。

template <class func, typename... Args>
static
typename func::result_type Cstate::RunProtectedCode(func function, Args&&... args) {
typename func::result_type ret = typename func::result_type();
__try {
ret = function(std::forward<Args>(args)...);
}
__except(ExceptionHandler(GetExceptionCode(), ExceptionStatus::CSubsystem)) {
fprintf(stderr, "First chance exception in C-code.\n");
}
return ret;
}

你可以这样调用它

std::function<int(int,int,int)> entry_f = entry;
RunProtectedCode(entry_f,1,2,3);

关于c++ - 接受带有 X 参数的可调用仿函数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589146/

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