C++ 是否适合为每个“类”使用构造函数重载的模板类;“类型”;
我不熟悉使用模板 使用构造函数重载为各种实际类型创建模板类是否合适 例如:C++ 是否适合为每个“类”使用构造函数重载的模板类;“类型”;,c++,templates,C++,Templates,我不熟悉使用模板 使用构造函数重载为各种实际类型创建模板类是否合适 例如: template <typename T> class A { A(..will receive paramaters for a specific type T); A(..will receive DIFFERENT params for a different type T); } 模板 甲级 { A(…将接收特定类型T的参数); A(…将接收不同类型T的不同参数); } 代码将被编
template <typename T>
class A
{
A(..will receive paramaters for a specific type T);
A(..will receive DIFFERENT params for a different type T);
}
模板
甲级
{
A(…将接收特定类型T的参数);
A(…将接收不同类型T的不同参数);
}
代码将被编译,因为每个实例化的所有功能都可以工作,不管从逻辑上(实际上)讲,每个构造函数都将根据我实际使用的类型被调用
这很符合我的目的,但这是一种正确的“编程心态”吗
更具体地说,使用SFML,我指的是, 一个是精灵,另一个是形状,但具有通用功能,但也具有独占功能,例如setColor或setTexture功能。我的意思是,将T的第二个构造函数作为sprite调用没有逻辑意义:
template <typename T>
class GameObject {
public:
GameObject(sf::Texture& texture, sf::Vector2f pos)
{
m_drawable.setTexture(texture);
m_drawable.setOrigin(m_drawable.getGlobalBounds().width / 2, m_drawable.getGlobalBounds().height / 2);
m_drawable.setPosition(pos);
}
GameObject(sf::Color color, sf::Vector2f pos)
{
m_drawable.setColor(color);
m_drawable.setPosition(pos);
}
private:
T m_drawable;
};
模板
类游戏对象{
公众:
游戏对象(sf::纹理和纹理,sf::矢量2F位置)
{
m_可拉深。设置纹理(纹理);
m_drawable.setOrigin(m_drawable.getGlobalBounds().width/2,m_drawable.getGlobalBounds().height/2);
m_可牵引设置位置(pos);
}
游戏对象(sf::彩色,sf::矢量2F位置)
{
m_可绘制。设置颜色(颜色);
m_可牵引设置位置(pos);
}
私人:
T m_可牵引;
};
据我所知,您将只有GameObject
和GameObject
,并使用模板分解一些常见代码,但这两个类都有特定的接口
那么,依我看,提供接口内的方法不使用是不好的
std::vector
提供了一些对类型T
有预先要求的方法(v.resize(count)
要求默认可插入)。但它是泛型类,组合将是巨大的,所以IMO可以接受
我认为应该从GameObject
- 在C++20中,有
允许有条件地“删除”方法:requires
template <typename T> class GameObject { public: GameObject(sf::Texture&, sf::Vector2f pos) requires(std::is_same_v<Sprite, T>); GameObject(sf::Color, sf::Vector2f pos) requires(std::is_same_v<Shape, T>); // ... };
T
使用构造函数,并为其他类型使用其他构造函数。“这很符合我的目的,但这是一种正确的“编程心态”吗?”简短回答:是的。如果我没弄错的话,您希望用不同的类型重载模板类—这就是模板类的使用方式。你必须记住不同的类型需要不同的方法。就在今天,我查看了EAs更快的矢量stl,您将看到如何将模板用于不同的类型谢谢您的回复。这对我来说似乎有些可疑。一般来说不一定是错误的,但在你的具体情况下可能不是很好,这取决于一些细节。不过,我对你的计划感觉不太好。所以对于这个类的一个实例化,T
将是一个sprite类,而在另一个T
中将是一个shape类?为什么drawables由GameObject
配置?游戏对象的目的/作用是什么?(是否GameObject
试图在一个类中做太多的事情?)
template <typename T>
class GameObject {
GameObject(T&& t) : m_drawable(std::move(t)){}
public:
friend GameObject<Sprite> GameSprite(sf::Texture& texture, sf::Vector2f pos) {
Sprite sprite;
sprite.setTexture(texture);
sprite.setOrigin(sprite.getGlobalBounds().width / 2, sprite.getGlobalBounds().height / 2);
sprite.setPosition(pos);
return GameObject<Sprite>{std::move(sprite)};
}
friend GameObject<Shape> GameShape(sf::Color color, sf::Vector2f pos) { /*..*/}
// ...
};