...

/

Exploring SFINAE and Its Purpose

Exploring SFINAE and Its Purpose

Explore different ways to restrict template arguments in this lesson.

Introduction to SFINAE

When we write templates, we sometimes need to restrict the template arguments. For instance, we have a function template that should work for any numeric type, therefore integral and floating-point, but should not work with anything else. Or we may have a class template that should only accept trivial types for an argument.

There are also cases when we may have overloaded function templates that should each work with some types only. For instance, one overload should work for integral types and the other for floating-point types only. There are different ways to achieve this goal, and we’ll explore them in this section and the next.

Press + to interact

Type traits, however, are involved in one way or another in all of them. The first one that we’ll discuss in this section is a feature called SFINAE. Another approach, superior to SFINAE, is represented by concepts, which will be discussed in the next section.

SFINAE stands for Substitution Failure Is Not An Error. When the compiler encounters the use of a function template, it substitutes the arguments in order to instantiate the template. If an error occurs at this point, it isn’t regarded as ill-informed code, only as a deduction failure. The function is removed from the overload set instead of causing an error. Only if there is no match in the overload set does an error occur.

Press + to interact

It’s difficult to really understand SFINAE without concrete examples. Therefore, we’ll go through several examples to explain the concept.

Every standard container, such as std::vector, std::array, and std::map, has iterators that not only enable us to access its elements but also modify the container (such as inserting after the element pointed by an iterator). Therefore, these containers have member functions to return iterators to the first and the one-past-last ...