Skip to main content

Subtle function overloading

Quite often I rediscover my own old posts and learn new things from it. This time I am revisiting the very first post http://cpptruths.blogspot.com/2005_06_19_cpptruths_archive.html
I came up with a puzzle to "entertain" you guys! Predict the output of following program. You know where to look at for the explanation.

const int FIRST_TIME = 1;
template <typename T>
void func (T &)
{
static int var;
++var;
if (FIRST_TIME == var)
cout << "Printed once." << endl;
else
cout << "Printed more than once." << endl;
}
int main(void)
{
int a1[4];
int a2[5];
func (a1);
func (a2);
}

OUTPUT:
Printed once.
Printed once.
!!
I would rather have a static checker to guard me against such subtle things.

Comments

Anonymous said…
I love it! Can I bookmark you and tell a friend? Sometimes I find a great blog like yours and my friends really like them too.

I'm just learning about blogs, but I really like what you've done here. Getting started with my sites: extra large dog houses | surf boards but they are still under development.

super job! so keep it up.
good day.
Excellent blog. Your site was great and will be
finding it again!  I surf the net for blogs like
yours.
You must peep out my coupon codes 1800contacts blog.
Hot blog. When I get to seraching on the web for
blogs, its got to be like yours! And the site is off
the hook! I just kept coming back!
I want you to look for my coupon 1800contacts blog.
Creative blog. I just kept looking at it over and
over! Im always looking for blogs like this!
Oh please, check for the blog site with my coupon 1800contacts!
Unbelievable blog. I can hardly wait to vist this
site again.I'm consistently looking up blogs like
this.
Stop by and look at my 1800contacts coupon blog site.
Sensational blog. I took pleasure in the site and I
will go back! Surfing online for blogs like this one
is worth my time.
Stop by and visiit my 1800contacts com coupon blog!
after-hours said…
I took pleasure in the site and I will go back!
Surfing online for blogs like this one is worth my
time. Sensational blog.
Come as you are and look at my coupon 1800contacts blog.
Inspiring blog. I love finding blogs this good on
the internet, when I have the time. I'm going to go
back to it!
Hey son, you need to check out my coupon codes 1800contacts blog!

Popular posts from this blog

Multi-dimensional arrays in C++11

What new can be said about multi-dimensional arrays in C++? As it turns out, quite a bit! With the advent of C++11, we get new standard library class std::array. We also get new language features, such as template aliases and variadic templates. So I'll talk about interesting ways in which they come together.

It all started with a simple question of how to define a multi-dimensional std::array. It is a great example of deceptively simple things. Are the following the two arrays identical except that one is native and the other one is std::array?

int native[3][4];
std::array<std::array<int, 3>, 4> arr;

No! They are not. In fact, arr is more like an int[4][3]. Note the difference in the array subscripts. The native array is an array of 3 elements where every element is itself an array of 4 integers. 3 rows and 4 columns. If you want a std::array with the same layout, what you really need is:

std::array<std::array<int, 4>, 3> arr;

That's quite annoying for two r…

Understanding Fold Expressions

C++17 has an interesting new feature called fold expressions. Fold expressions offer a compact syntax to apply a binary operation to the elements of a parameter pack. Here’s an example. template <typename... Args> auto addall(Args... args) { return (... + args); } addall(1,2,3,4,5); // returns 15. This particular example is a unary left fold. It's equivalent to ((((1+2)+3)+4)+5). It reduces/folds the parameter pack of integers into a single integer by applying the binary operator successively. It's unary because it does not explicitly specify an init (a.k.a. identity) argument. So, let add it. template <typename... Args> auto addall(Args... args) { return (0 + ... + args); } addall(1,2,3,4,5); // returns 15. This version of addall is a binary left fold. The init argument is 0 and it's redundant (in this case). That's because this fold expression is equivalent to (((((0+1)+2)+3)+4)+5). Explicit identity elements will come in handy a little la…

Folding Monadic Functions

In the previous two blog posts (Understanding Fold Expressions and Folding Functions) we looked at the basic usage of C++17 fold expressions and how simple functions can be folded to create a composite one. We’ll continue our stride and see how "embellished" functions may be composed in fold expressions.

First, let me define what I mean by embellished functions. Instead of just returning a simple value, these functions are going to return a generic container of the desired value. The choice of container is very broad but not arbitrary. There are some constraints on the container and once you select a generic container, all functions must return values of the same container. Let's begin with std::vector.
// Hide the allocator template argument of std::vector. // It causes problems and is irrelevant here. template <class T> struct Vector : std::vector<T> {}; struct Continent { }; struct Country { }; struct State { }; struct City { }; auto get_countries…