gpt4 book ai didi

c++ - 使用 boost::optional 捕获和包装异常

转载 作者:行者123 更新时间:2023-11-30 03:37:37 28 4
gpt4 key购买 nike

我想捕获库代码生成的异常并将它们包装在 boost::optional(或 std::experimental::optional)中。我的代码适用于简单的情况,但在调用重载函数时难以推断出正确的类型。我已将我的测试用例缩减为:

// Compile with: clang++ -std=c++14 -stdlib=libc++ -Wall -Wshadow -Wextra -o except_to_optional except_to_optional.cpp
#include <iostream>
#include <boost/optional.hpp>

template<typename Func, typename... Args>
auto try_call(Func f, Args&&... args) noexcept -> boost::optional<std::decay_t<decltype(f(std::forward<Args>(args)...))>>
{
using RT = std::decay_t<decltype(f(std::forward<Args>(args)...))>;
try {
return boost::make_optional<RT>(f(std::forward<Args>(args)...));
} catch(...) {
return boost::none;
}
}

int func1(char * ptr)
{
if (!ptr)
throw 14;

return strlen(ptr);
}

int func1(char * ptr, size_t len)
{
if (!ptr)
throw 14;

const size_t calc_len = strlen(ptr);
return calc_len < len ? calc_len : len;
}

int main(int argc, char **argv)
{
char *omg = "omg";

#if 1
// This is the desired syntax, but it fails
auto val = try_call(func1, omg);
#else
// This works, but its ugly
int (*f)(char *) = func1;
auto val = try_call(f, omg);
#endif

if (val)
std::cout << omg << " has a length of " << *val << "\n";
else
std::cout << "Something went wrong...\n";

return 0;
}

尝试编译“损坏的”示例时,我得到以下输出:

except_to_optional.cpp:50:14: error: no matching function for call to 'try_call'
auto val = try_call(func1, omg);
^~~~~~~~
except_to_optional.cpp:17:6: note: candidate template ignored: couldn't infer template argument 'Func'
auto try_call(Func f, Args&&... args) noexcept -> boost::optional<std::decay_t<decltype(f(std::forward<Args>(args)...))>>
^

我可以通过创建具有正确类型的函数指针来回避这个问题,但这并不理想。我的问题有解决方案吗,还是我被难看的函数指针 hack 困住了?

干杯,瑞安

最佳答案

在第一种情况下,您可能想要传递两个不同版本的 func1。编译器无法确定它需要实例化模板的 func1 的类型,因此它没有达到“查看”模板以查看“一个参数”的地步' 版本是正确的。

这就是编译器错误消息告诉您的内容。

在第二种情况下,您选择了一个 func1 重载并将其传递给 try_call。没有歧义,因此编译器可以确定将什么签名应用于模板。

关于c++ - 使用 boost::optional 捕获和包装异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40098022/

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