Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否适合为每个“类”使用构造函数重载的模板类;“类型”;_C++_Templates - Fatal编程技术网

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) { /*..*/}
    // ...
};