Re: Using SFINAE with member function types
On Jul 21, 12:36 am, Chris Fairles <chris.fair...@gmail.com> wrote:
Below is some code illustrating the wrong way to do what I'd like to
do. I have a class "A" with function "void f(int,int)" and class "B"
without that function. Is there a way to construct a traits-like
class, Q, that contains a constant expression (Q<T>::value) that
evaluates to true if some class T has the function "void f
(int,int)" ?
Pretend A and B cannot be changed. You only have Q to work with.
struct A {
void f (int,int){}
};
struct B{};
template <class T,class F=void>
struct Q {
enum{value=false};
};
template<class T>
struct Q<T,void(T::*)(int,int)> {
enum{value=true};
};
int main() {
if( Q<A>::value ) {cout << "A";}
if( !Q<B>::value ){cout << "B";}
}
I'd like this to output "AB". I've tried playing around with
boost::enable_if and boost::function_traits but have not come up with
a solution.
How about:
#include <iostream>
template <class T, void (T::*)(int, int) >
struct mf_bind
{
typedef T type;
};
template <class T1, class T2>
struct has_f
{
static const bool value = false;
};
template <class T>
struct has_f<T, typename mf_bind<T, &T::f>::type>
{
static const bool value = true;
};
template <class T>
struct Q
{
static const bool value = has_f<T, T>::value;
};
// A and B test classes
struct A
{
void f (int,int){}
};
struct B{};
using std::cout;
int main()
{
if( Q<A>::value ) {cout << "A";}
if( !Q<B>::value ){cout << "B";}
}
Program Output:
AB
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]