
________________________________ From: "Stewart, Robert" <Robert.Stewart@sig.com> To: "boost@lists.boost.org" <boost@lists.boost.org> Sent: Friday, March 16, 2012 2:29 PM Subject: Re: [boost] has_member_fnc?
Olaf van der Spek wrote:
On Fri, Mar 16, 2012 at 4:07 PM, Stewart, Robert <Robert.Stewart@sig.com> wrote:
Neal Becker wrote:
It seems c++11 has a new way to spell enable_if, and this can be used to implement has_member_fnc, as in this example:
I wish I could see the code, but pastebin is blocked here.
//Special template for EE_PDUs, which are weird template <typename T> auto getKey_imp(const T &struc, int &key, int) -> //If struc has an interesting_member member, this //version is used decltype(struc.interesting_member, void()) { key = 0; } template <typename T> void getKey_imp(const T &struc, int &key, long) //struc didn't have an interesting_member member, do //nothing { }
public: template <typename T> bool getKey(const T &struc, int &key) { getKey_imp(struc, key, 0); return key == 0; //Successful? }
Thank you.
Did I miss something? That just tests for a member by name. To test for a member function, you'd need to specify the signature to make it worthwhile.
In C++11, SFINAE was extended to work for expressions also. So this will work on compilers that support it(which MSVC does not). Using an expression is much better that the signature because this will work on template members, and it disambiguates better.