design question - way to specify what attribute of an object to process in a generic function

A

Alan

I was wondering if anyone had design advice on this. . . . I am
doing some mathematical operations looking at different metrics for
data (in objects) I have captured. The object class has several data
attributes, say: metric1, metric2, . . . metricN. These are different
metrics on which I am running statistics.

There are a number of operations I have to do on these objects for
each metric separately: sort, group (i.e., group a list of objects
based on a metric), etc. I understand the very basics of C++ template
functions, overloading, etc. However, I cannot figure out a way to
design a generic function to sort by each single attribute. So, I end
up with functions like: sort_by_metric1, sort_by_metric2, . . .
sort_by_metricN.

Is there a way to avoid so many nearly-duplicative functions? For
example, is there a way in the function call to tell the function what
metric I want to sort by? This would allow me to use one, generic
function vice a bunch of nearly-duplicative ones.

I hope this is clear. If not, please let me know, and I will
attempt to clarify.

Thanks, Alan
 
G

Gianni Mariani

Alan wrote:
....
Is there a way to avoid so many nearly-duplicative functions?

You can use pointer to member as a parameter to your comparison function
for sorting.

Look up "pointer to member" in your fav C++ book - if you have further
questions, post again.

BTW - pointer to member may be a template parameter OR a value
parameter. It probably makes little difference.

Another wat is to code up different "getter" functions that get
different metrics and use those functions in your sort parameters.
 
R

Robert Bauck Hamar

Alan said:
I was wondering if anyone had design advice on this. . . . I am
doing some mathematical operations looking at different metrics for
data (in objects) I have captured. The object class has several data
attributes, say: metric1, metric2, . . . metricN. These are different
metrics on which I am running statistics.

Something like

#include <vector>

struct object {
double metric1, metric2 ... metricN;
}

....
std::vector<object> data;
.... insert objects into data.
There are a number of operations I have to do on these objects for
each metric separately: sort, group (i.e., group a list of objects
based on a metric), etc. I understand the very basics of C++ template
functions, overloading, etc. However, I cannot figure out a way to
design a generic function to sort by each single attribute. So, I end
up with functions like: sort_by_metric1, sort_by_metric2, . . .
sort_by_metricN.

#include <algorithm>
#include <functional>

class less_metric1 : std::binary_function<object, object, bool>{
public:
return_type operator()(const object& a, const object& b) {
return a.metric1 < b.metric1;
}
}

....
std::sort(data.begin(), data.end(), less_metric1());
Is there a way to avoid so many nearly-duplicative functions? For
example, is there a way in the function call to tell the function what
metric I want to sort by? This would allow me to use one, generic
function vice a bunch of nearly-duplicative ones.

This is the purpose of templates.
 
A

Alan

Thank you. This was very helpful. Alan

Robert,
I do not really understand what the line

return_type operator()(const object& a, const object& b)

does in your definition of the binary function. Can you explain?

I think I understand the rest now. Thank you for the suggestion.

Alan
 
A

Alan

Never mind. I found some information and discovered on another
thread that I should use "result_type."

Thanks again, Alan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top