Sysop: | Amessyroom |
---|---|
Location: | Fayetteville, NC |
Users: | 26 |
Nodes: | 6 (1 / 5) |
Uptime: | 18:34:00 |
Calls: | 629 |
Files: | 1,186 |
D/L today: |
18 files (29,890K bytes) |
Messages: | 167,605 |
...
template<typename ... PassThrough>
struct exc_xguard
{
-a-a-a-atemplate<typename Func, typename Nested>
-a-a-a-aFORCEINLINE auto operator ()( Func func, Nested nested ) const
-a-a-a-a{
-a-a-a-a-a-a-a static_assert( sizeof ...(PassThrough) >= 1 );
-a-a-a-a-a-a-a try
-a-a-a-a-a-a-a {
-a-a-a-a-a-a-a-a-a-a-a using return_type = std::invoke_result_t<Func>;
-a-a-a-a-a-a-a-a-a-a-a return [&]<typename ... Pass>( this auto const &self,
std::tuple<Pass *...> ) L_FORCEINLINE -> return_type
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a {
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a try
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a {
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a if constexpr( sizeof ...(Pass) == 1 )
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a return func();
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a else
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a return self( typename
exc_xguard_unpack_last<Pass ...>::further() );
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a }
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a catch( typename exc_xguard_unpack_last<Pass ...>::type & )
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a {
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a throw;
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a }
-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a }( std::tuple<PassThrough *...>() );
-a-a-a-a-a-a-a }
-a-a-a-a-a-a-a catch( ... )
-a-a-a-a-a-a-a {
-a-a-a-a-a-a-a-a-a-a-a throw nested();
-a-a-a-a-a-a-a }
-a-a-a-a}
};
template<typename First, typename ... Further>As usual, the code itself is meaningless (likely so?).
struct exc_xguard_unpack_last
{
using further = std::tuple<Further *...>;
using type = typename exc_xguard_unpack_last<Further ...>::type;
};
template<typename Last>
struct exc_xguard_unpack_last<Last>
{
using type = Last;
};
template<typename ... PassThrough>
struct exc_xguard
{
template<typename Func, typename Nested>
FORCEINLINE auto operator ()( Func func, Nested nested ) const
{
static_assert( sizeof ...(PassThrough) >= 1 );
try
{
using return_type = std::invoke_result_t<Func>;
return [&]<typename ... Pass>( this auto const &self, std::tuple<Pass
*...> ) L_FORCEINLINE -> return_type
{
try
{
if constexpr( sizeof ...(Pass) == 1 )
return func();
else
return self( typename exc_xguard_unpack_last<Pass ...>::further() );
}
catch( typename exc_xguard_unpack_last<Pass ...>::type & )
{
throw;
}
}( std::tuple<PassThrough *...>() );
}
catch( ... )
{
throw nested();
}
}
};
As usual, the code itself is meaningless (likely so?).
What is the purpose of the codes, and useful in what environment/condition?
C++ is expressive. But more importantly, expressive for what? If the author is
not clear of the logic of his idea/concept, what would the 'expressive' mean? That is the general C++ problem: It greatly helps writing obscure codes.