Ce que tu demandes à Laurent c'est de distribuer des binaires C++03 et des binaires C++11 ? Je doute qu'il accepte
Non, c'est ça qui est marrant: ce qui est possible, c'est de compiler la SFML en C++11 et de laisser le choix à l'utilisateur d'utiliser les nouvelles fonctionalités ou non (ou tout simplement parce que son compilateur ne le supporte pas).
Un petit exemple rapide. Laurent, tu me dis si un pull qui ressemblerai à ça serait accepté
Imaginons que je compile ma librairie
libtest.so pour supporter ET le C++11 ET les anciennes versions. Voilà le contenu des fichiers:
Test.hpp#ifndef TEST_HPP
#define TEST_HPP
struct Test
{
Test();
~Test();
Test(const Test&);
Test& operator=(const Test&);
#ifdef USE_RREF // aha!
Test(Test&&);
Test& operator=(Test&&);
#endif
};
#endif // TEST_HPP
Test.cpp#include <iostream>
#include "Test.hpp"
using namespace std;
Test::Test()
{
cout << "default constructor" << endl;
}
Test::Test(const Test&)
{
cout << "copy constructor" << endl;
}
#ifdef USE_RREF // re- aha!
Test::Test(Test&&)
{
cout << "move constructor" << endl;
}
#endif
Test::~Test()
{
cout << "destructor" << endl;
}
Test& Test::operator=(const Test&)
{
cout << "operator= copy" << endl;
return *this;
}
#ifdef USE_RREF
Test& Test::operator=(Test&&)
{
cout << "operator= move" << endl;
return *this;
}
#endif
Ici, on peut choisir de supporter au non les
constructeurs de mouvement.
Compilons la lib avec ce nouveau support (sans oublier d'utiliser C++11
):
g++ -shared Test.cpp Test.hpp -DUSE_RREF -std=c++11 -o libtest.so
Après, le code utilisateur pourra choisir d'utiliser les nouvelles fonctionalitées ou non:
main.cpp#include <Test.hpp>
#include <iostream>
using namespace std;
int main()
{
Test t1;
t1 = Test();
return 0;
}
me:~/projects/tests$ mv libtest.so ~/home/me/bin
me:~/projects/tests$ g++ main.cpp -I. -L/home/me/bin -ltest -o sans_rvalue
me:~/projects/tests$ g++ main.cpp -I. -L/home/me/bin -ltest -o avec_rvalue -std=c++11 -DUSE_RREF
me:~/projects/tests$ ./sans_rvalue
default constructor
default constructor
operator= copy
destructor
destructor
me:~/projects/tests$ ./avec_rvalue
default constructor
default constructor
operator= move // Le constructeur de copie n'est ici plus utilisé
destructor
destructor
Et avec la seule librairie compilée en C++11
Après il peut être encore meilleur de détecter automatiquement si le compilateur supporte les nouvelles fonctionalités désirées, sans que l'utilisateur n'ai rien à définir