C ++ wrapper pentru boost/c ++ 11

I am not sure the title of the question is proper. Here is the problem. I am writing a library which use some c++11 library features. Clearly not all implementations support these libraries yet and thus there is the portability problem. It does not matter which library is of concern here. One solution is to use boost, which already provide a lot c++11 libraries. So my solution is to define a macro, say USE_CXX11, and define a new namespace say internal and introduce names into this internal namespace dependent on the macros. For example say I need to use a name foo from a C++ library , which is also available in . What I do is

#ifdef USE_CXX11
#include 
#else
#include 
#endif

namespace internal {
#ifdef USE_CXX11
using std::foo;
#else
using boost::foo::foo;
#endif
}

Și în restul bibliotecii folosesc doar internal :: foo . Codul terță parte care utilizează această bibliotecă poate defini macro-ul adecvat pentru a indica dacă are o implementare c ++ 11 funcțională sau poate utiliza doar un impuls. Și biblioteca mea va prelua antetul corect și spațiul de nume. Aceasta funcționează până acum. Sper că mi-am explicat bine intenția.

Dar soluțiile de mai sus mi se pare foarte urât. Există o practică mai bună pentru astfel de lucruri? Sau există situații posibile în care această abordare nu va funcționa?

0
Am nevoie să sprijine ambii compilatori vechi folosind boost și cei noi care nu doresc să folosească boost pentru orice motiv (cine știe?) Boost Tr1 nu este o soluție. De exemplu, libc ++ nu are deloc tr1, are ca scop c ++ 11 de la început. Deci, există încă problema cu două nume de spațiu.
adăugat autor Yan Zhou, sursa
M-am gândit să folosim doar un impuls pentru o perioadă foarte lungă de timp. Și așa a început proiectul. Dar mai târziu am aflat că toate lucrurile pe care le folosesc sunt de asemenea disponibile în c ++ 11. Deci, cred că ar fi bine să nu forțați o dependență terță parte dacă utilizatorul are un compilator recent. De fapt, dacă am nevoie de stimulare, atunci trebuie să solicit cel puțin să câștig 1,49, cea mai recentă versiune și să depășesc cele mai multe distribuții Linux. Chiar și recentul lansat fedora 17 are doar un boost de 1,48. Deci, prin forțarea impulsului am nevoie de utilizator p
adăugat autor Yan Zhou, sursa
@GManNickG Cealaltă problemă este că stimularea nu funcționează la fel de bine ca implementările c ++ 11 recente. De exemplu, biblioteca aleatoare are încă câteva erori, ceea ce afectează rezultatele matematic. Astfel de bug-uri sunt, de asemenea, legate de comportamente non-standard conforme. Această problemă nu există în ultimele libstdc ++ sau libc ++ sau msvc 10. Deci vreau doar să câștig ca backup.
adăugat autor Yan Zhou, sursa
Aceasta este de fapt o bibliotecă științifică de calcul. Și într-o etapă ulterioară biblioteca va oferi o interfață R. Asta este ceea ce oamenii vor folosi într-adevăr, (deși câțiva pot folosi API-ul C ++ pentru performanță și flexibilitate, deoarece este o bibliotecă de șabloane). Astfel, alegerea dintre Boost și std va fi făcută la momentul construirii pachetului R și ales automat de sistemul de construire.
adăugat autor Yan Zhou, sursa
Check out Boost.TR1
adăugat autor K-ballo, sursa
Folosiți doar Boost dacă este de ajutor. Dacă v-ați dorit doar o singură clasă sau ceva, atunci aș spune să remake-o. Dar dacă cineva intenționează să utilizeze C ++, trebuie să fie suficient de competent și suficient de dispus să instaleze Boost. Singurul efect secundar de a face acest lucru este că aveți acum o colecție utilă de biblioteci la dispoziția dumneavoastră.
adăugat autor GManNickG, sursa
De ce nu folosiți doar impulsul?
adăugat autor fbafelipe, sursa
Dacă este în Boost și trebuie să sprijiniți compilarele depășite, trebuie doar să o utilizați în Boost direct.
adăugat autor Cat Plus Plus, sursa

2 răspunsuri

I don't see this as a workable solution. Conditionally switching between classes will restrict their use to only those member functions having the same signatures and semantics. You are also redirecting access to The Standard Library which may feel unnatural for many developers.

Dacă utilitatea este o preocupare între C ++ 03 și C ++ 11, atunci ar trebui să mergeți cu Boost pentru tot. Dacă C ++ 11 este singura dvs. țintă, este posibil să aveți un succes mai bun în evaluarea diferitelor compilatoare pentru a vedea ce funcții de limbă și bibliotecă le suportă. Alegeți cele care sunt bine susținute și considerate libere. Pentru orice altceva, folosiți Boost și refactor mai târziu, dacă este necesar, pentru a susține mai multe caracteristici ale bibliotecii C ++ 11. Veți fi mai bine să folosiți bibliotecile în tandem, decât să treceți între ele.

Puteți începe cu pagina de stare a standardului C ++ al GCC Implementarea bibliotecii .

0
adăugat

Soluția ta îmi arată bine; singura problemă va fi (așa cum menționează Chet) în cazurile în care interfețele și/sau implementările Boost și C ++ 11 diferă.

De fapt, fac asta în biblioteca Boost.Algorithms (nouă în versiunea viitoare de 1,50)

namespace boost { namespace algorithm {
#if __cplusplus >= 201103L
using std::find_if_not;     //Section 25.2.5
#else
template 
InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate p )
{
    for ( ; first != last; ++first )
        if ( !p(*first))
            break;
    return first;
}
#endif
}}
0
adăugat