Allowing only certain classes as template parameters

H

Helge Preuss

I have a function template

template <typename T> void f (std::vector<T> values, int max) {
// ...
if (std::accumulate (values.begin (), values.end (), T()) > max) {
// ...
}
// ...
}

Because I use std::accumulate (), there are some restrictions on T:
T must have an operator + () and an explicit default constructor. It
also needs an operator int () so that the result of std::accumulate
can be compared to max.

(How) can I ensure that f is only called with types that meet these
restrictions? I thought of defining an abstract base class which
implements the needed functions and allowing only derived classes as
template parameter. But I don't know how to express this. Is it
possible at all?

Helge
 
J

JKop

Helge Preuss posted:

(How) can I ensure that f is only called with types that meet these
restrictions?

The compiler does that for you. It simply won't compile if
the necessary member function and operators aren't defined.

Outside of that, just document that specific member
functions and operators that must be defined.

-JKop
 
T

tom_usenet

I have a function template

template <typename T> void f (std::vector<T> values, int max) {
// ...
if (std::accumulate (values.begin (), values.end (), T()) > max) {
// ...
}
// ...
}

Because I use std::accumulate (), there are some restrictions on T:
T must have an operator + () and an explicit default constructor. It
also needs an operator int () so that the result of std::accumulate
can be compared to max.

(How) can I ensure that f is only called with types that meet these
restrictions? I thought of defining an abstract base class which
implements the needed functions and allowing only derived classes as
template parameter. But I don't know how to express this. Is it
possible at all?

Obviously it won't compile if you pass something without the necessary
functionality. But if you want clearer error messages, you can use
"Concept Checks". See
http://www.boost.org/libs/concept_check/concept_check.htm

You can also use the enable_if library to eliminate "f" from overload
resolution if certain criteria aren't met, but I think that's overkill
for your example.

Tom
 

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

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top