By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,086 Members | 1,442 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,086 IT Pros & Developers. It's quick & easy.

template-based test function for unary operators?

P: n/a
Somewhat a C++ beginner, I'm trying to make a general test function
that could test unary operators (or methods) of an object of any class.

Arguments are a member-pointer to the function, a single input
argument of some type for that function, and the expected result of
some type. Then it tests if the result is as expected, and does some
logging of the results (pass, fail) etc.

Well, the template "mess" does not quite work out.

Below is the code. After that, the error messages.

--------------------------------------------------------

class A {
int f (int c) { return c; }
int f (const char c) { return c; }
A& operator+= (A const& a) { return *this; }
};

template <class rettype, class argtype, class btype>
bool unary_op_test(rettype (*func)(argtype),
btype self, argtype arg, rettype expect)
{
rettype rv = self.func(arg);
bool result = (rv == expect);
return result;
}

int main ()
{
A aa;
int (A::*p1)(int) = &A::f;
A& (A::*p2)(A const&) = &A::operator+=;
unary_op_test<int,int,A&>(p1, aa, 12, 12);
unary_op_test<A&,A&,A&>(p2, aa, aa, aa);
unary_op_test<A&,const A&,A&>(p2, aa, aa, aa);
}

--------------------------------------------------------

$ g++ -Wall -pedantic test.cc
test.cc: In function 'int main()':
test.cc:21: error: no matching function for call to
'unary_op_test(int (A::*&)(int), A&, int, int)'
test.cc:22: error: no matching function for call to
'unary_op_test(A& (A::*&)(const A&), A&, A&, A&)'
test.cc:23: error: no matching function for call to
'unary_op_test(A& (A::*&)(const A&), A&, A&, A&)'

--------------------------------------------------------

How come "A& (A::*&)(const A&)" does not map to "rettype
(*func)(argtype)"<templatedi.e. to "A&(*func)(const A&)"?

Sure some beginner mistake somewhere... :)

Any ideas?

- Jan
Oct 3 '08 #1
Share this Question
Share on Google+
3 Replies


P: n/a
JanW wrote:
Somewhat a C++ beginner, I'm trying to make a general test function that
could test unary operators (or methods) of an object of any class.

Arguments are a member-pointer to the function, a single input argument
of some type for that function, and the expected result of some type.
Then it tests if the result is as expected, and does some logging of the
results (pass, fail) etc.

Well, the template "mess" does not quite work out.

Below is the code. After that, the error messages.

--------------------------------------------------------

class A {
int f (int c) { return c; }
int f (const char c) { return c; }
A& operator+= (A const& a) { return *this; }
};

template <class rettype, class argtype, class btype>
bool unary_op_test(rettype (*func)(argtype),
btype self, argtype arg, rettype expect)
{
rettype rv = self.func(arg);
bool result = (rv == expect);
return result;
}

int main ()
{
A aa;
int (A::*p1)(int) = &A::f;
A& (A::*p2)(A const&) = &A::operator+=;
unary_op_test<int,int,A&>(p1, aa, 12, 12);
unary_op_test<A&,A&,A&>(p2, aa, aa, aa);
unary_op_test<A&,const A&,A&>(p2, aa, aa, aa);
}

--------------------------------------------------------

$ g++ -Wall -pedantic test.cc
test.cc: In function 'int main()':
test.cc:21: error: no matching function for call to 'unary_op_test(int
(A::*&)(int), A&, int, int)'
test.cc:22: error: no matching function for call to 'unary_op_test(A&
(A::*&)(const A&), A&, A&, A&)'
test.cc:23: error: no matching function for call to 'unary_op_test(A&
(A::*&)(const A&), A&, A&, A&)'

--------------------------------------------------------

How come "A& (A::*&)(const A&)" does not map to "rettype
(*func)(argtype)"<templatedi.e. to "A&(*func)(const A&)"?

Sure some beginner mistake somewhere... :)

Any ideas?
Only one idea so far: the type "a pointer to a [non-static] member
function of class T" is not convertible to "a pointer to function".

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 3 '08 #2

P: n/a
Victor Bazarov wrote:
JanW wrote:
<snip>
Only one idea so far: the type "a pointer to a [non-static] member
function of class T" is not convertible to "a pointer to function".
Oops, true. That was quick, thanks :-)

After the first attempts it has now started working. As a first
version, just rewriting unary_op_test() to like below (and defining
A::operator== in class A) removes the complaints:

template <class rettype, class argtype, class btype>
bool unary_op_test(rettype (btype::* func)(argtype), btype& self,
argtype arg, rettype expect)
{
rettype rv = (self.*func)(arg);
bool result = (rv == expect);
return result;
}

And then call the tests like below:

unary_op_test<int,int,A>(p1, aa, 12, 12);
unary_op_test<A&,const A&,A>(p2, aa, aa, aa);
unary_op_test(p1, aa, 12, 12);

Thanks!

- Jan
Oct 3 '08 #3

P: n/a
JanW wrote:
Well, the template "mess" does not quite work out.

Below is the code. After that, the error messages.

--------------------------------------------------------

class A {
int f (int c) { return c; }
int f (const char c) { return c; }
A& operator+= (A const& a) { return *this; }
};

template <class rettype, class argtype, class btype>
bool unary_op_test(rettype (*func)(argtype),
btype self, argtype arg, rettype expect)
{
rettype rv = self.func(arg);
bool result = (rv == expect);
return result;
}

int main ()
{
A aa;
int (A::*p1)(int) = &A::f;
A& (A::*p2)(A const&) = &A::operator+=;
unary_op_test<int,int,A&>(p1, aa, 12, 12);
unary_op_test<A&,A&,A&>(p2, aa, aa, aa);
unary_op_test<A&,const A&,A&>(p2, aa, aa, aa);
}
Pointers to member functions are not pointers to functions, and there's
no implicit conversion. There are other issues in your code, but this is
the main one. Here's a rough function template accepting a pointer to
member function:

template< typename Ret, typename C, typename Arg>
void f( Ret ( C::*pmf )( Arg ),
C & c,
Arg a )
{
( c.*pmf )( a ) ;
}

usable as follows:

A instance = {} ;
int ( A::*p1 )( int ) = &A::f;
f( p1, instance, 12 ) ;

--
Gennaro Prota | name.surname yahoo.com
Breeze C++ (preview): <https://sourceforge.net/projects/breeze/>
Do you need expertise in C++? I'm available.
Oct 3 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.