Cześć, załóżmy że tworzę super bibliotekę, która ma swojego własnego stringa i inne bajery.
Biblioteka ma być uruchamiana na różnych wersjach VisualStudio.
Żeby było mi prościej, chciałbym posłużyć się STLem. W związku z tym, że to nie przejdzie w nagłówkach, wymyśliłem, że można by używać STLa w pImpl. Na takiej zasadzie.
Mamy klasę stringa:
class EXTRALIB_API ELString
{
public:
ELString();
ELString(const ELString & other);
ELString(const wchar_t * pOther);
~ELString();
ELString & operator=(const ELString & other);
bool operator==(const ELString & other);
bool operator!=(const ELString & other);
void toLower();
void toUpper();
int length() const;
const wchar_t * c_str() const;
private:
class Impl;
Impl * m_pImpl;
};
A teraz załóżmy, że Impl wygląda tak:
class ELString::Impl
{
public:
Impl()
{
}
~Impl()
{
}
std::wstring buffer;
};
A przykładowy kod metody toLower tak:
void ELString::toLower()
{
std::transform(m_pImpl->buffer.begin(), m_pImpl->buffer.end(), m_pImpl->buffer.begin(), ::towlower);
}
I teraz pytanie. W związku z tym, że moja biblioteka może być uruchamiana na różnych visualach, to czy takie rozwiązanie jest bezpieczne? Zrobiłem prosty test. Taką przykładową bibliotekę napisałem sobie w VS2012, a aplikację, która ją używa w VS2019. Biblioteka została skompilowana z toolsetem v110, a aplikacja z v142. I wygląda, że działa. Niemniej jednak mój test jest prosty. Więc stąd pytanie - czy takie użycie STL w implu jest bezpieczne?