Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > template-based test function for unary operators?

Reply
Thread Tools

template-based test function for unary operators?

 
 
JanW
Guest
Posts: n/a
 
      10-03-2008
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:perator+=;
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)"<templated> i.e. to "A&(*func)(const A&)"?

Sure some beginner mistake somewhere...

Any ideas?

- Jan
 
Reply With Quote
 
 
 
 
JanW
Guest
Posts: n/a
 
      10-03-2008
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:perator== 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
 
Reply With Quote
 
 
 
 
Gennaro Prota
Guest
Posts: n/a
 
      10-03-2008
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:perator+=;
> 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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Overloading unary minus for use in function calls Matthew Cook C++ 6 12-20-2006 10:04 PM
Ordinary unary function to STL adaptable unary predicate how? SpOiLeR C++ 10 10-19-2005 01:18 PM
Problem with unary function for_each franklini@hotmail.com C++ 11 03-15-2005 05:25 AM
STL bind1st counterpart for unary function Fred Ma C++ 2 02-05-2004 10:52 AM
test test test test test test test Computer Support 2 07-02-2003 06:02 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57