Testing for template argument being result of takeExactly
monarch_dodra
monarchdodra at gmail.com
Mon Sep 24 00:41:26 PDT 2012
On Monday, 24 September 2012 at 07:07:16 UTC, Jonathan M Davis
wrote:
> On Monday, September 24, 2012 08:21:46 monarch_dodra wrote:
>> template Hello(R)
>> if ( is(typeof(takeExactly(R.init, 1))) &&
>> is(R == typeof(takeExactly(R.init, 1)))
>> )
>> {
>> alias R Hello;
>> }
>
>> What is wrong with my proposed solution?
>
> It may work, but again, it's relying on how takeExactly works.
> It's testing
> that you can call takeExactly on R.init and then that R is the
> same type as
> that result, which means that it's relies on the fact that
> takeExactly returns
> itself if you call takeExactly on it. It also relies on init,
> which can be
> risky, given the fact that it can be disabled.
>
> So, between your prosposal and the other that Philippe and
> Timon gave, theirs
> seems better. But unfortunately, none of the proposals work
> generically.
> Ideally, there would be a way to generically test that a type
> is the type
> returned by particular function, and I would _think_ that
> that's possible, but
> the way that I would expect to work doesn't.
>
> Regardless, thanks for your help.
>
> - Jonathan M Davis
Good points.
Regarding the ".init" issue, I hadn't thought of that, but it can
be worked around pretty easily with an is(R r):
--------
template Hello(R)
if ( is(R r) &&
is(typeof(takeExactly(r, 1))) &&
is(R == typeof(takeExactly(r, 1)))
)
{
alias R Hello;
}
--------
After that, I guess it is indeed one implementation detail vs the
other.
IMO, it really depends on whether or not you'd want "int[]" to be
considered the return type of a takeExactly :/ Maybe it is, maybe
it ain't.
More information about the Digitalmars-d-learn
mailing list