On 22 Jul 2004 06:07:05 -0700,
gjong@gmx.net (Helge Preuss) wrote:
[color=blue]
>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?[/color]
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_ch...cept_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