Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 4. duben 2012, 21:17:01 Předmět: Skrýtí závislosti na STL |
|
|
Zdravím ve spolek,
pracuju teď na jednom frameworku, a ten nepoužívá STL, všechno si totiž implementuje sám a nebo používá další "3rd party" knihovny.
Problém je v tom, že s příchodem C++11 jsou ve STL "věci", které nelze nijak re-implementovat, protože vyžadují určitou "pomoc" překladače. Mluvím konkrétně o hlavičce <type_traits>, ve kterých najdete "funkce" pro SFINAE, např. is_pod(), is_union(), is_abstract(), apod.
Problém je v tom, že já ty nové "věci" ze STL potřebuju naládovat do toho framework, tak ale abych skryl závislost na STL (do té doby než to půjde jinak). Přemýšlel jsem, že bych udělal něco takového:
kód: |
namespace Core
{
namespace Private
{
#include <type_traits>
}
template<typename T>
struct IsAbstract : Private::std::is_abstract<T>
{
...
}
} |
Samozřejmě to nefunguje... Ta hlavička (v implementaci pro MSVC) používá spousty maker, které jsou z větší části fixované na jmenný prostor std, takže to nejde zkompilovat (háže plno chyb i v takto jednoduchém příkladu).
Věděl by někdo nějaký trik na to, jak s tím vyčůrat (tak abych ale nemusel přímo editovat ten hlavičkový soubor type_traits)?  _________________
 |
|
Návrat nahoru |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 5. duben 2012, 08:11:57 Předmět: |
|
|
A) Nic jako STL neexistuje, to je jen zažité historické označení, správě je "standardní knihovna" (bez ohledu na templejtky)
B) Nejde. Dědičnost v C++ nevyřešíš aniž by byli viditelní rodiče.
C) Proč to vůbec potřebuješ? Jaký máš důvod odstínit i takové malé hlavičky jako <type_traits>? _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 5. duben 2012, 10:47:04 Předmět: |
|
|
-Samozřejmě, ale The Internet by s tebou určitě nesouhlasil
-To byl jen příklad pro zjednodušení. Ve skutečnosti to dělám bez dědičnosti a využívám jen hodnotu konstanty "value".
-Už jsem to vysvětloval. Ten framework STL vůbec nepoužívá, tak proč bych měl "špinit" globální jmenný prostor tím jmenným prostorem std z hlavičky type_traits. Už jen tím importem té hlavičky zašpiním ten framework všemi těmi makry z té hlavičky. _________________
 |
|
Návrat nahoru |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 5. duben 2012, 11:31:23 Předmět: |
|
|
Tak s konstantou se lze vypořádat tak, že ji definuješ v jednom extra souboru a do ostatních ji přivedeš pomocí extern. Nic lepšího asi vymyslet nejde.
Namespace std je v mnoha místech nedílnou součástí C++. Na jedno z takových míst jsi narazil, dalšími jsou std::nothrow, std::bad_alloc, celé <typeinfo> a další, nově například std::begin a std::end, std::nullptr_t nebo std::initializer_list.
Pokud ti tak moc vadí, budeš se muset bez těchto featur obejít.
Zašpinění makry bych se nebál, zběžně jsem si <type_traits> z GCC proletěl a ačkoliv si pomocných maker pár definuje, zase je na konci zruší, a pokud hlavičky tvého kompilátoru za sebou nějaké smetí nechávají, asi bych přehodnotil, jak moc zrovna tento potřebuju. _________________ WWW | GitHub | TW |
|
Návrat nahoru |
|
 |
|