Re: template + lambda function matching - howto
Am 30.01.2012 23:37, schrieb Daniel Kr?gler:
On 2012-01-30 13:57, Helmut Jarausch wrote:
gcc 4.7 (git) fails to compile the following lines
[..]
What can I do to make it conform to the standard?
You have to disable argument deduction for the second depending
parameter by transforming it into a non-deduced context, e.g. like so:
template <typename T>
struct identity { typedef T type; };
template <typename Element>
void QuickSort(std::vector<Element>& V, int lo, int hi,
typename identity<bool(*)(const Element&, const Element&)>::type);
This signature will ensure that parameter "Element" is solely deduced
from the first argument.
Given that transforming the signature of QuickSort as shown above tends to be quite unreadable and hard to understand one could consider to take advantage of a new C++11 idiom based on alias templates. Typically this would be implemented as follows:
namespace details {
template <typename T>
struct identity { typedef T type; };
}
template<typename T>
using non_deduced = typename details::identity<T>::type;
Only the template non_deduced should be considered as public API. With this short-cut at hand one could declare QuickSort now in a more intuitive way as
template <typename Element>
void QuickSort(std::vector<Element>& V, int lo, int hi,
non_deduced<bool(const Element&, const Element&)>* less);
Note that gcc 4.7 has a bug and does not accept this form yet, it will accept the variant
template <typename Element>
void QuickSort(std::vector<Element>& V, int lo, int hi,
non_deduced<bool(*)(const Element&, const Element&)> less);
though.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]