<div dir="ltr">In <font face="monospace, monospace">Allocator.h</font>, there are two <font face="monospace, monospace">static_assert</font>s that are guarded by an <font face="monospace, monospace">#ifdef __clang__</font>. What's up with that? Shouldn't non <font face="monospace, monospace">__clang__</font> environments be able to do this? Surely there's a better way to check for overloads?<div><div><br></div><div>The two <font face="monospace, monospace">static_assert</font>s in question:<br><br></div><div><pre style="color:gainsboro;background:rgb(30,30,30)"><font face="monospace, monospace">  <span style="color:darkgreen">/// \brief Allocate \a Size bytes of \a Alignment aligned memory. This method</span>
  <span style="color:darkgreen">/// must be implemented by \c DerivedT.</span>
  <span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">*</span><span style="color:rgb(200,200,200)">Allocate</span><span style="color:rgb(180,180,180)">(</span><span style="color:rgb(78,201,176)">size_t</span> <span style="color:rgb(127,127,127)">Size</span><span style="color:rgb(180,180,180)">,</span> <span style="color:rgb(78,201,176)">size_t</span> <span style="color:rgb(127,127,127)">Alignment</span><span style="color:rgb(180,180,180)">)</span> <span style="color:rgb(180,180,180)">{</span>
<span style="color:rgb(155,155,155)">#ifdef</span> __clang__
    <span style="color:rgb(86,156,214)">static_assert</span><span style="color:rgb(180,180,180)">(</span><span style="color:rgb(86,156,214)">static_cast</span><span style="color:rgb(180,180,180)"><</span><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">*(</span>AllocatorBase<span style="color:rgb(180,180,180)">::*)(</span>size_t<span style="color:rgb(180,180,180)">,</span> size_t<span style="color:rgb(180,180,180)">)>(</span>
                      <span style="color:rgb(180,180,180)">&</span>AllocatorBase<span style="color:rgb(180,180,180)">::</span>Allocate<span style="color:rgb(180,180,180)">)</span> <span style="color:rgb(180,180,180)">!=</span>
                      <span style="color:rgb(86,156,214)">static_cast</span><span style="color:rgb(180,180,180)"><</span><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">*(</span>DerivedT<span style="color:rgb(180,180,180)">::*)(</span>size_t<span style="color:rgb(180,180,180)">,</span> size_t<span style="color:rgb(180,180,180)">)>(</span>
                          <span style="color:rgb(180,180,180)">&</span>DerivedT<span style="color:rgb(180,180,180)">::</span>Allocate<span style="color:rgb(180,180,180)">),</span>
                  <span style="color:rgb(214,157,133)">"Class derives from AllocatorBase without implementing the "</span>
                  <span style="color:rgb(214,157,133)">"core Allocate(size_t, size_t) overload!"</span><span style="color:rgb(180,180,180)">);</span>
<span style="color:rgb(155,155,155)">#endif</span>
    <span style="color:rgb(86,156,214)">return</span> <span style="color:rgb(86,156,214)">static_cast</span><span style="color:rgb(180,180,180)"><</span><span style="color:rgb(78,201,176)">DerivedT</span> <span style="color:rgb(180,180,180)">*>(</span><span style="color:rgb(86,156,214)">this</span><span style="color:rgb(180,180,180)">)-></span>Allocate<span style="color:rgb(180,180,180)">(</span><span style="color:rgb(127,127,127)">Size</span><span style="color:rgb(180,180,180)">,</span> <span style="color:rgb(127,127,127)">Alignment</span><span style="color:rgb(180,180,180)">);</span>
  <span style="color:rgb(180,180,180)">}</span>
 
  <span style="color:darkgreen">/// \brief Deallocate \a Ptr to \a Size bytes of memory allocated by this</span>
  <span style="color:darkgreen">/// allocator.</span>
  <span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(200,200,200)">Deallocate</span><span style="color:rgb(180,180,180)">(</span><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">*</span><span style="color:rgb(127,127,127)">Ptr</span><span style="color:rgb(180,180,180)">,</span> <span style="color:rgb(78,201,176)">size_t</span> <span style="color:rgb(127,127,127)">Size</span><span style="color:rgb(180,180,180)">)</span> <span style="color:rgb(180,180,180)">{</span>
<span style="color:rgb(155,155,155)">#ifdef</span> __clang__
    <span style="color:rgb(86,156,214)">static_assert</span><span style="color:rgb(180,180,180)">(</span><span style="color:rgb(86,156,214)">static_cast</span><span style="color:rgb(180,180,180)"><</span><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">(</span>AllocatorBase<span style="color:rgb(180,180,180)">::*)(</span><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">*,</span> size_t<span style="color:rgb(180,180,180)">)>(</span>
                      <span style="color:rgb(180,180,180)">&</span>AllocatorBase<span style="color:rgb(180,180,180)">::</span>Deallocate<span style="color:rgb(180,180,180)">)</span> <span style="color:rgb(180,180,180)">!=</span>
                      <span style="color:rgb(86,156,214)">static_cast</span><span style="color:rgb(180,180,180)"><</span><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">(</span>DerivedT<span style="color:rgb(180,180,180)">::*)(</span><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(180,180,180)">*,</span> size_t<span style="color:rgb(180,180,180)">)>(</span>
                          <span style="color:rgb(180,180,180)">&</span>DerivedT<span style="color:rgb(180,180,180)">::</span>Deallocate<span style="color:rgb(180,180,180)">),</span>
                  <span style="color:rgb(214,157,133)">"Class derives from AllocatorBase without implementing the "</span>
                  <span style="color:rgb(214,157,133)">"core Deallocate(void *) overload!"</span><span style="color:rgb(180,180,180)">);</span>
<span style="color:rgb(155,155,155)">#endif</span>
    <span style="color:rgb(86,156,214)">return</span> <span style="color:rgb(86,156,214)">static_cast</span><span style="color:rgb(180,180,180)"><</span><span style="color:rgb(78,201,176)">DerivedT</span> <span style="color:rgb(180,180,180)">*>(</span><span style="color:rgb(86,156,214)">this</span><span style="color:rgb(180,180,180)">)-></span>Deallocate<span style="color:rgb(180,180,180)">(</span><span style="color:rgb(127,127,127)">Ptr</span><span style="color:rgb(180,180,180)">,</span> <span style="color:rgb(127,127,127)">Size</span><span style="color:rgb(180,180,180)">);</span>
  <span style="color:rgb(180,180,180)">}</span></font><font face="Consolas">
</font></pre></div><div><div><br></div><div><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><span style="font-size:12.8px">Sincerely,</span><br style="font-size:12.8px"><span style="font-size:12.8px">Alexander Riccio</span><br style="font-size:12.8px"><span style="font-size:12.8px">--</span><br style="font-size:12.8px"><span style="font-size:12.8px">"Change the world or go home."</span><div style="font-size:12.8px"><a href="http://about.me/ariccio" target="_blank">about.me/ariccio</a></div><div style="font-size:12.8px"><a href="http://about.me/ariccio" target="_blank"><br></a></div><div style="font-size:12.8px">If left to my own devices, I will build more.</div><div style="font-size:12.8px">⁂</div></div></div></div></div></div>
</div></div></div></div>