我在C ++ 11中有一个包装函数,旨在与lambda一起使用,如下所示:
template<typename Func>
int WrapExceptions(Func&& f)
{
try
{
return f();
}
catch(std::exception)
{
return -1;
}
}
我可以这样称呼它:
int rc = WrapExceptions([&]{
DoSomething();
return 0;
});
assert(rc == 0);
生活还可以。不过,我想做的是重载或专用化包装函数,以便当内部函数返回void时,外部函数返回默认值0,例如:
int rc = WrapExceptions([&]{
DoSomething();
});
assert(rc == 0);
我实际上可以在C ++ 11中执行此操作吗?我一辈子都想不起来。
您可以使用SFINAE:
和 std::result_of
template<typename Func>
typename std::enable_if<
std::is_convertible<typename std::result_of<Func()>::type, int>::value,
int
>::type
WrapExceptions(Func&& f)
{
try { return f(); }
catch(std::exception) { return -1; }
}
template<typename Func>
typename std::enable_if<
std::is_same<void, typename std::result_of<Func()>::type>::value,
int
>::type
WrapExceptions(Func&& f)
{
try { f(); return 0; /* default value */ }
catch(std::exception) { return -1; }
}
与decltype
:
template<typename Func>
auto
WrapExceptions(Func&& f)
-> typename std::enable_if<
std::is_convertible<decltype(f()), int>::value,
int
>::type
{
try { return f(); }
catch(std::exception) { return -1; }
}
template<typename Func>
auto
WrapExceptions(Func&& f)
-> typename std::enable_if<
std::is_same<void, decltype(f())>::value,
int
>::type
{
try { f(); return 0; }
catch(std::exception) { return -1; }
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句