Re: Can you solve this function chaining quiz?
On May 8, 1:21 pm, DeMarcus <use_my_alias_h...@hotmail.com> wrote:
Hi,
I have a problem. I want to throw ExceptionA derived from Exception, i.e.
struct ExceptionA : Exception
{
};
ExceptionA, ExceptionB, ExceptionC, etc. shall be able to attach text to the exception directly at construction via function chaining, i.e.
throw ExceptionA().addText( "Hello" ).addText( "World" );
The quick way to implement that would be the following.
struct Exception
{
Exception& addText( const std::string& str )
{
// Add str to some private string.
return *this;
}
};
Now, the problem comes with the throw.
throw ExceptionA().addText( "Hello" ).addText( "World" );
That will slice the exception and not throw an ExceptionA but instead just a plain Exception since that is what addText() returns.
I do not entirely understand why this is necessary. If this addText
function is proving difficult, why not do something more obvious?
std::string exceptionText = "Hello ";
exceptionText += "world";
throw ExceptionA( exceptionText ); // Make ctor accept string.
Maybe this is overly simplistic. Maybe you want something to be done
to the string, other than concatenation. In that case, write a
function that concatenates the string with whatever extra you need!
But, maybe ExceptionA().addText(string("x")+string("y")) will have a
different effect than ExceptionA().addText("x").addText("y"). Then how
about this:
// Assuming that overloading this function per type is
impractical.
template< typename E >
E addText( E e, string str )
{
e.addText( str );
return e;
}
// Somewhere, later on...
throw addText( addText(ExceptionA(), "Hello"), "World" );
Using C++0x, there are variadic templates and a variadic ctor would
solve this whole problem, no? G++ currently supports this, but i don't
believe MSVC does... yet.
I think this problem should be defined more clearly. If addText does
nothing but adds text, concatenation, then my first solution is
adequate, just a little inconvenient for getting it all done in one
line. If addText does anything more, then my last solution should be
adequate.
Though, ignoring all that, what's wrong with this:
ExceptionA e;
e.addText("x").addText("y");
throw e;
Is part of the specification for the problem "Must be done in one
line."? All this seems like a lot of work for just pretty syntax,
unless i'm missing something.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]