【发布时间】:2019-02-01 12:39:26
【问题描述】:
今天我正在为 C++ 模板而苦苦挣扎。这是我在 JNI 代码中方便异常处理的简单代码。
template<typename T>
std::optional<T> handleNativeCrash(JNIEnv *env, std::function<T(void)> f) {
try {
return std::optional<T>(f());
}
catch (const std::exception &e) {
jniThrowException(env, e.what());
return {};
}
}
当我尝试在不指定 T 的情况下使用它时,Clang 大致失败并出现此错误
no matching function for call to 'handleNativeCrash'
return my_namespace::handleNativeCrash(env, [&]{
^~~~~~~~~~~~~~~~~~~~~
/......../jni.cpp:116:39)'
std::optional<T> handleNativeCrash(JNIEnv *env, std::function<T(void)> f) {
^
1 error generated.
我想从 lambda 返回类型自动推断出T。我试图写演绎指南,但似乎我无法为全局函数编写它。我尝试创建仅包含此功能的简单模板结构,但我也失败了。看来我不是很懂 C++ 模板元编程。
我的第一次尝试是这样的,但是 Clang 刚刚崩溃,抱怨语法非法并打印了它的回溯。我会尽快报告错误,但我需要先完成这项工作。
template<typename T>
handleNativeCrash(JNIEnv *env, std::function<T(void)> f) -> handleNativeCrash<decltype(f())>;
我怎样才能实现我的目标?
【问题讨论】:
-
lambda 不是
std::function。最好使用通用的Callable类型。 -
关于你的clang崩溃:clang是对的它是非法的(缺少
auto),错误的崩溃。
标签: c++ c++17 template-argument-deduction