<p>In <a href="https://github.com/mlpack/mlpack/pull/747#discussion_r75060087">src/mlpack/methods/neighbor_search/spill_search_impl.hpp</a>:</p>
<pre style='color:#555'>&gt; +         typename MatType,
&gt; +         template&lt;typename HyperplaneMetricType&gt; class HyperplaneType,
&gt; +         template&lt;typename SplitBoundT, typename SplitMatT&gt; class SplitType&gt;
&gt; +void SpillSearch&lt;MetricType, MatType, HyperplaneType, SplitType&gt;::
&gt; +Search(const MatType&amp; querySet,
&gt; +       const size_t k,
&gt; +       arma::Mat&lt;size_t&gt;&amp; neighbors,
&gt; +       arma::mat&amp; distances)
&gt; +{
&gt; +  if (Naive() || SingleMode())
&gt; +    neighborSearch.Search(querySet, k, neighbors, distances);
&gt; +  else
&gt; +  {
&gt; +    // For Dual Tree Search on SpillTrees, the queryTree must be built with non
&gt; +    // overlapping (tau = 0).
&gt; +    Tree queryTree(querySet, 0 /* tau */, leafSize, rho);
</pre>
<p>Ok, in this case, it is a lot of work to duplicate the entire class.  Instead I think we should use template specialization, but we can't specialize only a single member of a template class, so instead you'll need to write an auxiliary method kinda like:</p>

<pre><code>template&lt;typename TreeType&gt;
TreeType* BuildQueryTree(arma::mat&amp; dataset, boost::disable_if&lt;IsSpillTree&lt;TreeType&gt;&gt;::value*)
{
  return new TreeType(dataset);
}

template&lt;typename TreeType&gt;
TreeType* BuildQueryTree(const arma::mat&amp; dataset, boost::enable_if&lt;IsSpillTree&lt;TreeType&gt;&gt;::value)
{
  return new TreeType(dataset, 0, leafSize, rho);
}
</code></pre>

<p>I've omitted a lot of details and there are probably syntax errors but the basic idea is to just use SFINAE in a standalone helper function.  I guess maybe it would have been easier for me to just say "check out <code>BuildTree()</code> at the top of neighbor_search_impl.hpp"...! :)</p>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">&mdash;<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/mlpack/mlpack/pull/747/files/fe090ee13c7cad79e2b7eb8b6690628ba3ead1ed#r75060087">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AJ4bFD_Yu4mKZc2dn-gI-bf8EF1yatIDks5qgonVgaJpZM4JZzLU">mute the thread</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/AJ4bFC3UT_-nvQLMyGO45HHfFDE2wEQ7ks5qgonVgaJpZM4JZzLU.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
<div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
  <link itemprop="url" href="https://github.com/mlpack/mlpack/pull/747/files/fe090ee13c7cad79e2b7eb8b6690628ba3ead1ed#r75060087"></link>
  <meta itemprop="name" content="View Pull Request"></meta>
</div>
<meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>

<script type="application/json" data-scope="inboxmarkup">{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/mlpack/mlpack","title":"mlpack/mlpack","subtitle":"GitHub repository","main_image_url":"https://cloud.githubusercontent.com/assets/143418/17495839/a5054eac-5d88-11e6-95fc-7290892c7bb5.png","avatar_image_url":"https://cloud.githubusercontent.com/assets/143418/15842166/7c72db34-2c0b-11e6-9aed-b52498112777.png","action":{"name":"Open in GitHub","url":"https://github.com/mlpack/mlpack"}},"updates":{"snippets":[{"icon":"PERSON","message":"@rcurtin in #747: Ok, in this case, it is a lot of work to duplicate the entire class.  Instead I think we should use template specialization, but we can't specialize only a single member of a template class, so instead you'll need to write an auxiliary method kinda like:\r\n\r\n```\r\ntemplate\u003ctypename TreeType\u003e\r\nTreeType* BuildQueryTree(arma::mat\u0026 dataset, boost::disable_if\u003cIsSpillTree\u003cTreeType\u003e\u003e::value*)\r\n{\r\n  return new TreeType(dataset);\r\n}\r\n\r\ntemplate\u003ctypename TreeType\u003e\r\nTreeType* BuildQueryTree(const arma::mat\u0026 dataset, boost::enable_if\u003cIsSpillTree\u003cTreeType\u003e\u003e::value)\r\n{\r\n  return new TreeType(dataset, 0, leafSize, rho);\r\n}\r\n```\r\n\r\nI've omitted a lot of details and there are probably syntax errors but the basic idea is to just use SFINAE in a standalone helper function.  I guess maybe it would have been easier for me to just say \"check out `BuildTree()` at the top of neighbor_search_impl.hpp\"...! :)"}],"action":{"name":"View Pull Request","url":"https://github.com/mlpack/mlpack/pull/747/files/fe090ee13c7cad79e2b7eb8b6690628ba3ead1ed#r75060087"}}}</script>