<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'>> + typename MatType,
> + template<typename HyperplaneMetricType> class HyperplaneType,
> + template<typename SplitBoundT, typename SplitMatT> class SplitType>
> +void SpillSearch<MetricType, MatType, HyperplaneType, SplitType>::
> +Search(const MatType& querySet,
> + const size_t k,
> + arma::Mat<size_t>& neighbors,
> + arma::mat& distances)
> +{
> + if (Naive() || SingleMode())
> + neighborSearch.Search(querySet, k, neighbors, distances);
> + else
> + {
> + // For Dual Tree Search on SpillTrees, the queryTree must be built with non
> + // overlapping (tau = 0).
> + 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<typename TreeType>
TreeType* BuildQueryTree(arma::mat& dataset, boost::disable_if<IsSpillTree<TreeType>>::value*)
{
return new TreeType(dataset);
}
template<typename TreeType>
TreeType* BuildQueryTree(const arma::mat& dataset, boost::enable_if<IsSpillTree<TreeType>>::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;">—<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>