[Dune] specializing template classes for Dune::Grid

Matteo Semplice matteo.semplice at unito.it
Tue Sep 2 08:26:37 CEST 2014


Wonderful! I'll give this a go!

Thank you very much!

     Matteo

On 01/09/2014 23:01, Jö Fahlke wrote:
> Basically, what you want is SFINAE and
> Dune::Capabilities::hasSingleGeometryType<Grid>.  SFINAE means "substitution
> failure is not an error".  It works like this: instead of
>
>    template<class G>
>    struct SomeClass;
>
>    template<>
>    struct SomeClass<OneDGrid>
>    { /*...*/ };
>
> you do something like this:
>
>    template<class G, class Dummy = void>
>    struct SomeClass;
>
>    template<class G>
>    struct SomeClass<G, typename std::enable_if<G::dimension == 1>::type>
>    { /* specialization for dim==1 */ };
>
> The way this works is that when you instantiate SomeClass<SomeGrid>, the
> compiler enumerates all the specializations of the template SomeClass.  The
> extra parameter Dummy is not given and so defaults to void.  It then tries
> whether it can instantiate each specialization with the parameters G=SomeGrid
> and Dummy=void.  If SomeGrid::dimension == 1, then in the specialization above
> the second parameter will become enable_if<true>::type, which is void, so the
> specialization is viable and takes precedence over the general template.
>
> If SomeGrid::dimension != 1 however, then in the specialization above the
> second parameter will become enable_if<false>::type.  But enable_if<false> has
> no member type, so the attempt to instantiate the template results in a
> substitution failure.  But, since "substitution failure is not an error", this
> just means that the specialization is simply removed from the list of
> candidates for this instantiation, and what remains is the general template.
>
> The other specialization can be done like this:
>
>    template<class G>
>    struct SomeClass<G, typename std::enable_if<
>       G::dimension == 2 &&
>       Dune::Capabilities::hasSingleGeometryType<G>::topologyId == topologyIdForQuad
>    >::type>
>    { /* specialization for dim==1 */ };
>
> Here, a substitution failure can actually occur also if
> hasSingleGeometryType<SomeGrid> has no member topologyId.  But that just means
> that SomeGrid can contain triangles in addition to quads, so you probably
> don't want to handle that anyway.
>
> I saw enable_if first in boost, and it has some fairly extensive
> documentation[1].  It has made it into the standard by now.  Dune also
> contained an implementation of enable_if at some point.
>
> [1] http://www.boost.org/doc/libs/1_56_0/libs/core/doc/html/core/enable_if.html
>
> Hope this helps,
> Jö.
>
> Am Mon,  1. Sep 2014, 22:07:15 +0200 schrieb Matteo Semplice:
>> Date: Mon, 01 Sep 2014 22:07:15 +0200
>> From: Matteo Semplice <matteo.semplice at unito.it>
>> To: dune <dune at dune-project.org>
>> Subject: [Dune] specializing template classes for Dune::Grid
>> X-No-Auth: unauthenticated sender
>> X-IControl-Milter-MD5SUM: b896b3bd8c6043342bbe89d4fe6f0d28
>> X-No-Relay: not in my network
>> X-Icontrol: Sent by Inrete Icontrol
>> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101
>>   Icedove/24.7.0
>> X-IControl-Milter-Checked: yes (IControlServer: opterone SrcIpType:
>>   UnTrusted SrcIpHeaderType: Undefined Authenticated: yes)
>> X-IControl-Milter-SPF-Checked: yes (IControlServer: opterone HeloSPFType:
>>   unknown FromSPFType: none HeloHeaderSPFType: Undefined FromHeaderSPFType:
>>   none)
>> X-IControl-Milter-MD5SUM: b896b3bd8c6043342bbe89d4fe6f0d28
>> X-Inrete-Amavisjob-Virus-Scanned: PDAmail Multiple Antivirus with ClamAv
>> X-Inrete-Amavisjob-Service-Runned: 6 (s81K7Fq5030666)
>> X-Inrete-Amavisjob-Service-Disabled: No Service disabled (s81K7Fq5030666)
>> X-Spam-Flag: No
>> X-Envelope-From: <matteo.semplice at unito.it>
>>
>> Dear duners,
>>      my last attempt to update to version 2.3 halted on specializing
>> a class that depend on a grid type as template parameter and, after
>> the new alugrid module and the updated UG licence, I would like to
>> give it another go...
>>
>> I have a class R that depends on the template parameter G, which is
>> a Dune Grid. Most of the methods of the class depend on the Grid
>> dimension and on the Grid's cell type, so in order to implement
>> them, I need to specialize the class for
>> 1) any grid in 1 spatial dimenion
>> 2) any grid in 2 spatial dimensions based on quad
>>
>> My old implementation based on dune 2.2 had actually 3
>> specializations for Dune::OneDGrid, for Dune::AlbertaGrid<1,1>, and
>> for Dune::ALUCubeGrid<2,2>, the first two being identical and I used
>> some #define's in order not to rewrite the 1d code twice. However, I
>> couldn't get the correct replacement for Dune::ALUCubeGrid<2,2> in
>> the new naming scheme of dune 2.3 that would make the 2d code to
>> compile.
>>
>> So, the question is if it is possible to specialize as in (1) and
>> (2), so that one implementation will take care of both
>> Dune::OneDGrid and Dune::AlbertaGrid<1,1> and the other
>> implementation of AluGrid and UG based on quad. This, of course,
>> would be the most elegant solution.
>>
>> If not, what is the translation of Dune::ALUCubeGrid<2,2> in the new
>> naming scheme of dune 2.3?
>>
>> Thanks in advance!
>>
>> Best,
>>     Matteo
>>
>> _______________________________________________
>> Dune mailing list
>> Dune at dune-project.org
>> http://lists.dune-project.org/mailman/listinfo/dune
>>





More information about the Dune mailing list