Inspiration Code

A couple of week ago I run into Modern C++ Design, a book from Andrei Alexandrescu. I read it all the way in just a few days. That was so fascinating! This book shows you the unknown and magic power of template metaprogramming… a kind of avada kedavra of C++.

I’ve got uncertain reviews from my colleagues about this book… But my opinion is definitely a ten out of ten.

But now, let’s get to the topic! Just a few day ago, I started writing some code for one of my so-called “funprojects”. A snippet of code contained in thread.h file to wraps pthreads functions with a Thread class. After few attempts I decided that my Thread class should be able to execute everything that is a callable in C++.

From Modern C++ Design, here is the list of entities that support operator ().

  • C-like functions
  • C-like pointers to functions
  • References to functions
  • Functors (object that defines operator() )

The result of applying operator .* or operator ->* having a pointer to a member function in the right-hand side of the expression. The behavior that I was trying to achieve for any of them was

RETURN_TYPE result = Thread::run(some_callable, arg1, arg2, ...);

And this is what I’ve got in the end

// main.cpp
#include <iostream>
#include "thread.h"
int myfun(int i)
{
    std::cout << "myfun received: " << i << std::endl;
    return i*2;
}

class myclass
{
public:

    myclass(int i) : i(i) {}

    int mymember(int k)
    {
        std::cout << "mymember received: " << k << std::endl;
        return i*2;
    }
    int i;

    int operator()(int j)
    {
        std::cerr << "operator received: " << j << std::endl;
        return i*2;
    }

};

int main(int argc, char** argv)
{

    int (*mypt)(int) = &myfun;
    int (&myref)(int) = myfun;
    myclass mc(5);

    // Call to function
    Result<int> r0 = Thread::run(myfun, 0);
    std::cout << "retval:" << r0.value() << std::endl;

    // Call to function pointer
    Result<int> r1 = Thread::run(mypt, 1);
    std::cout << "retval:" << r1.value() << std::endl;

    // Call to function reference
    Result<int> r2 = Thread::run(myref, 2);
    std::cout << "retval:" << r2.value() << std::endl;

    // Call to functor
    Result<int> r3 = Thread::run<int>(mc, 3);
    std::cout << "retval:" << r3.value() << std::endl;

    // Call to member function pointer
    Result<int> r4 = Thread::run(&mc, &myclass::mymember, 4);
    std::cout << "retval:" << r4.value() << std::endl;

    return 0;
}

In the next post I’m going to show some details of the code in thread.h.

Want to compile and run this code?!

git clone git://github.com/cybercase/funproject.git
cd funproject/other
g++ concurrent.cpp -o concurrent -Wall # add -lpthread if you are on a linux system

— 19/12/2011