ich diese Klasse habenC++ das erste Argument Wert in Template-Parameter-Pack
class AssetManager
{
private:
std::unordered_map<const std::type_info*, Asset*> assets;
public:
AssetManager();
virtual ~AssetManager();
template <typename T, typename ...Args>
bool newAsset(Args... args)
{
//Get path
if(cached(path)) { return true; }
auto asset = new T{ std::forward<Args>(args)... };
assets[&typeid(*asset)] = asset;
return *static_cast<T*>(assets[&typeid(T)]);
}
bool cached(const std::string& path)
{
for(auto asset : assets) {
if(asset.second->getPath() == path) {
return true;
}
}
return false;
}
};
Das erste Argument eines jeden Vermögens immer std :: string Pfad. Ich versuche, diesen Wert zu erhalten und sehen, ob es bereits in der Liste geladen ist. Asset ist eine abstrakte Klasse.
class Asset
{
private:
std::string path;
public:
Asset(const std::string& path);
virtual ~Asset() = default;
virtual bool load() = 0;
std::string getPath();
};
Anlageklassen erben unterschiedliche Anzahl von Argumenten haben und als solche ich versuche, den Wert des ersten Arguments zu erfassen, weil es immer eine std :: string Pfad sein wird, wie Sie in der Asset-Klasse sehen können Konstrukteur.
Bin ich völlig zu einfältig, wenn ich dir sage, nur ein std :: string Argument vor args zu deklarieren, da es obligatorisch ist? –
Ja, mach das. Andernfalls können Sie nicht erzwingen, was die Leute im Paket weitergeben. Warum sollten Sie die Möglichkeit verpassen, es falsch zu machen? –
Schlagen Sie 'bool newAsset (Args && ... args)' vor, um eine einwandfreie Weiterleitung zu unterstützen. Ohne das '&&' kopierst du immer deine Argumente. – aschepler