Есть ли способ создать «пустые» типы для использования в шаблонах классов?

#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();
}
 

Это позволяет вам объявлять все различные типы текстур, которые вы хотите поддерживать, в одном месте и не позволяет пространству имен загромождаться множеством пустых типов.