<div dir="ltr"><div style>[cfe-dev now on BCC.]</div><div><br></div>On Wed, May 22, 2013 at 8:03 PM, Aleksandar Fabijanic <span dir="ltr"><<a href="mailto:aleskx@gmail.com" target="_blank">aleskx@gmail.com</a>></span> wrote:<br>
<div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks for prompt response.<br>
<div class="im"><br>
On Wed, May 22, 2013 at 9:47 PM, James Dennett <<a href="mailto:james.dennett@gmail.com">james.dennett@gmail.com</a>> wrote:<br>
<br>
> I'm not sure this is topical for cfe-dev, as it's just a question about C++.<br>
<br>
</div>I'm not sure, either and I apologize if this is out of place. If<br>
someone can point me to the right place (or continue private<br>
discussion) I'd be happy to do that. I just never had problem with<br>
other compilers, so I thought I'd ask here for clarification.<br>
<div class="im"><br>
> C++ doesn't have partial specialization for templates,<br>
<br>
</div>I guess you meant for functions?<br></blockquote><div><br></div><div style>Sorry: for function templates.  (Of course we do have partial specialization for class templates.)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im"><br>
> so it's not possible<br>
> to define a std::swap for a user-define template.<br>
<br>
</div>Poco::Data::Statement is not a template.<br>
<br>
The question is about full specialization, which is explicitly permitted:</blockquote><div> </div><div style>The _answer_ is not just about full specialization though.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">
> You could write an<br>
> overload, except that it's not permitted to add overloads to namespace std.<br>
<br>
</div>I am aware of that. That's why it is specialized.<br>
<div class="im"><br></div></blockquote><div><br></div><div style>You misread me.  The sentence above was about class templates, e.g., MyContainer<T>.  You cannot specialize std::swap for MyContainer<T>, because of the lack of function partial specialization.  You could specialize for particular instances of MyContainer<T>, but that's not what you want.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
> On the bright side, ADL means that it's not necessary to put those in<br>
> namespace std anyway, so long as people use swap properly (such that ADL is<br>
> enabled).<br>
<br>
</div>I understand there is a workaround,</blockquote><div><br></div><div style>I would not call it a workaround.  Calling std::swap directly is the wrong thing to do.  Adding it to an overload set along with functions (and function templates) found via ADL is the right way to call swap.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> but if someone explicitly calls<br>
std::swap<Statement>, then my swap will not be called.<br>
<br></blockquote><div><br></div><div style>Right.  That's why they should not do that.  That's not swap's interface.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I'm interested in a generic answer to the question: why is<br>
specializing standard templates (such as e.g. std::swap) not a good<br>
practice?<br>
<br></blockquote><div><br></div><div style>Because it's not a general solution (because it can't work for class templates), and a general solution exists (put the swap in the right namespace, and call it via ADL).</div>
<div style><br></div><div style>How/where would you implement a swap for MyContainer<T>?  You can't put a function template in namespace std.</div><div style><br></div><div style>It would be ugly to have one solution for class templates and another for non-templates.  Too ugly even for C++.</div>
<div style> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Again, thanks and if there is a better place for this discussion<br>
please point me there.<br></blockquote><div><br></div><div style>comp.lang.c++.moderated, Stack Overflow, choose your poison.</div><div style><br></div><div style>-- James</div><div style><br></div></div></div></div>