#c
Вопрос:
У меня есть шаблон класса, который выглядит следующим образом:
template <typename T>
class TextureIcon
{
static std::unique_ptr<Texture> s_texture_;
public:
static void setTextureFile(std::stringamp;amp; filePath);
static std::unique_ptr<TextureIcon<T>> instance();
private:
TextureIcon();
sf::Sprite sprite_;
};
Идея в том, что его можно использовать для создания значков, которые используют одну и ту же текстуру, как это:
class FlowerTexture;
int main()
{
TextureIcon<FlowerTexture>::setTextureFile("flower-texture.png");
auto flower1 = TextureIcon<FlowerTexture>::instance();
auto flower2 = TextureIcon<FlowerTexture>::instance();
auto flower3 = TextureIcon<FlowerTexture>::instance();
}
Это работает должным образом, но я немного недоволен использованием class
для создания типов, которые будут использоваться для разных TextureIcon
классов, так как это похоже на прямые объявления для классов, которые будут реализованы позже.
Поэтому мне интересно: есть ли ключевое слово для создания «пустых» типов без реализации? Что-то вроде этого:
DefineType MyType;
Комментарии:
1.
class FlowerTexture {};
2. В чем смысл
T
параметра для вашего шаблона? Почему это должен быть тип?3. вы также можете написать
using FlowerTextureIcon = TextureIcon<struct FlowerTextureTag>;
, что может быть более ясным в отношении предполагаемого использования этого прямого объявленного, но не определенного класса.4. @JaMiT Чем еще это может быть, если не типом? Я не знал, что вы можете использовать шаблоны с чем-либо, кроме типов.
5. @JensB Тот, кто научил вас шаблонам, оказал вам плохую услугу. Видишь cppreference.com для получения информации о шаблонах и параметрах шаблонов . В качестве примера
std::array
приведен шаблон с параметром, не относящимся к типу.
Ответ №1:
Вместо использования типов вы можете использовать an enum class
для создания различных перечислений текстур, а затем использовать этот тип перечисления в качестве параметра шаблона, не относящегося к типу, для TextureIcon
класса. Это выглядело бы так
enum class Textures { Flower, Leaf, Branch };
template <Textures T>
class TextureIcon
{
static Textures s_texture_;
public:
static void setTextureFile(std::stringamp;amp; filePath);
static std::unique_ptr<TextureIcon<T>> instance();
private:
TextureIcon();
int sprite_;
};
int main()
{
TextureIcon<Textures::Flower>::setTextureFile("flower-texture.png");
auto flower1 = TextureIcon<Textures::Flower>::instance();
auto flower2 = TextureIcon<Textures::Flower>::instance();
auto flower3 = TextureIcon<Textures::Flower>::instance();
}
Это позволяет вам объявлять все различные типы текстур, которые вы хотите поддерживать, в одном месте и не позволяет пространству имен загромождаться множеством пустых типов.