小编Sep*_*ram的帖子

STL中的写时复制支持

我刚刚阅读了一篇关于写时复制的维基百科文章(如果有任何支持它的文件系统很好奇),并对以下段落感到惊讶:

COW也在内核之外,库,应用程序和系统代码中使用.例如,C++标准库提供的字符串类是专门为允许写时复制实现而设计的:

std::string x("Hello");

std::string y = x;  // x and y use the same buffer

y += ", World!";    // now y uses a different buffer
                    // x still uses the same old buffer
Run Code Online (Sandbox Code Playgroud)

我不知道STL中是否支持copy-on-write.真的吗?它是否适用于其他STL类,例如std::vectorstd::array?哪些编译器支持该优化(特别是,我想知道G ++,英特尔C++编译器和Microsoft C++编译器)?

c++ compiler-construction stl copy-on-write

9
推荐指数
1
解决办法
5943
查看次数

C++:默认的复制构造函数是否受到其他构造函数和析构函数的影响?

我们知道,如果声明了任何构造函数(包含复制构造函数),则不会隐式创建默认构造函数(不带参数的构造函数).使用默认复制构造函数(执行对象的浅层复制的构造函数)会发生同样的情况吗?此外,析构函数的存在是否会对此产生影响?

c++ copy-constructor default-constructor

8
推荐指数
2
解决办法
1570
查看次数

C++:使用CRTP,派生类中定义的类在基类中不可访问

这是(简化的)基类:

template <class T>
class SharedObject
{
protected:
    QExplicitlySharedDataPointer <typename T::Data> d;
};
Run Code Online (Sandbox Code Playgroud)

以下是派生的:

class ThisWontCompile : public SharedObject <ThisWontCompile>
{
private:
    friend class SharedObject;
    struct Data : public QSharedData
    {
        int id;
    };
};
Run Code Online (Sandbox Code Playgroud)

是否有任何解决方法从SharedObject访问ThisWontCompile :: Data?使用基础对象中的派生对象究竟能做什么,究竟什么不能完成?

c++ qt templates crtp

7
推荐指数
1
解决办法
1309
查看次数

C++:模板和单例模式

它发生在我需要臭名昭着的单身人士模式.更好的是,它发生在我需要臭名昭着的C++模板与该模式相结合.那么,困扰我的是:

template <class T>
class PDatabaseTable
{
    ...

    static PDatabaseTable <T> & instance()
    {
        static PDatabaseTable <T> singleton;
        return singleton;
    }

    ...
};
Run Code Online (Sandbox Code Playgroud)

这是实现应该在第一次使用时创建的单例的典型方法.现在,我们有一个静态变量单例.由于可以从几个不同的模块调用instance()函数,问题是:对于任何给定的类型T,对象只有一个实例,或者每个模块是否会实例化它自己的单例?

c++ singleton templates

7
推荐指数
1
解决办法
6245
查看次数

有没有办法在像QPushButton这样的简单小部件上启用文本自动换行?

我想进行自动QPushButton换行并扩展它的高度而不是扩展宽度.我怎样才能做到这一点?

qt word-wrap

7
推荐指数
3
解决办法
1万
查看次数

使用scons管理版本的最佳实践?

我希望我的Qt/C++应用程序知道它是哪个版本.它应该知道不是来自某些配置文件,而是将版本号编译成应用程序二进制文件.版本本身就是字符串,如"XYZ",其中X是主要版本号,Y是次要版本号,Z是SVN下的修订版(或SVN下的版本号减去版本"XY0"出来时的版本号) .您认为用scons实现这一目标的最简单方法是什么?

c++ qt scons

6
推荐指数
1
解决办法
999
查看次数

QSettings不能很好地处理unicode

我正在使用QSettings一些设置存储在INI文件中.但是,我的程序不是英文,因此某些设置包含Unicode字符串.似乎Qt写的INI文件不是在utf8或utf16中,而是在其他一些编码中,字符串"Приветмир!" (rus."Hello world!")看起来像这样:

WindowTitle=\x41f\x440\x438\x432\x435\x442 \x43c\x438\x440!
Run Code Online (Sandbox Code Playgroud)

我想手动编辑设置文件,但我不能像这样使用它.有没有办法强制Qt以Unicode保存?

unicode qt qsettings

6
推荐指数
1
解决办法
3593
查看次数

如何存储有关表的元数据?

我有一张桌子.一个包含25列的大表,每列包含有关特定实体的原子数据.具体而言,实体是待售的房地产(如房间和房屋),因此该表称为财产.

每个属性都有一个子类(实际上这就是所谓的"类型",但我们会称之为"继承",以避免与数据类型的混乱),在这个时刻"已经建成,待出售"或"正在建设中,但可以投入".它还有很多属性,如地址,价格等,其中大部分都是在子类之间共享,但有些则不是.属性具有不同的数据类型,它们是:

  • 整数
  • 浮点数字
  • 短文本
  • 长长的文字
  • 其他表的外键

这些"其他表格"用于从主持人可编辑的选项列表中进行选择(例如城区列表,建筑公司列表等).

主持人应该能够创建新属性并进行编辑.用户应该能够查看某些属性的详细信息并搜索满足特定条件的属性,然后将其作为表格查看,可以按其中一列进行排序.

根据属性的子类,只有一部分属性属性可供用户查看,也可供主持人进行编辑.此外,根据数据类型,需要使用不同的HTML代码向用户显示这些属性,并为主持人提供编辑控件,以及在编辑后应执行不同的数据验证检查.

字段列表不是动态的 - 列的列表以及它们的显示方式不太可能经常更改,并且主持人无需更改它.

但是,由于25是一个相当大的数字,我想在一个地方组织并保存有关属性表的所有元数据:有关哪些子类是列的信息以及如何显示,编辑和验证数据.能够以一种简单的方式(如数组)从我的代码中访问所有这些元数据会很高兴.我看到三个选项:


1.常量PHP数组

只需创建一个PHP文件或函数,它将使用元数据构造数组,然后在需要时包含/调用它.

优点:

  • 简单.
  • 快速.

缺点:

  • 由于过于冗长和丑陋的PHP代码,难以维护.

2. MySQL数据库

在数据库中创建表property_meta并在其中存储元数据.新的表将包含列名从属性表中,数据的相关性在此列中的每个的特性的子类,预期的数据类型等等.然后创建将查询必要的字段以及作为数组返回得到的数据的功能.

优点:

  • 更容易更改元数据.
  • 维护的代码更少.
  • 可以在以后扩展到允许用户更改列的列表.从属性表中添加或删除列不会有太大问题.虽然在我看来,用户能够动态更改数据库架构是一个严重的代码味道.如我错了请纠正我.

缺点:

  • 每当更改元数据时,必须相应地更新服务器数据库.但它只会在数据库架构发生变化时发生,所以没有人关心.
  • 更慢 - 以创建阵列为代价,这将增加与服务器通信的成本和从数据库中选择数据的成本.虽然后者很可能被MySQL查询缓存机制否定.

3.将属性及其属性分隔到不同的表中

按照上面的解决方案创建元数据表,只将其命名为property_attribute.还可以使用propertyproperty_attribute的外键创建property_data表,并为属性值创建另一列.然后,属性表将只包含主键和子类,并且只能使用具有两个连接的查询来检索实际属性值.

优点:

  • 最灵活的解决方案 如果更改了属性列表,则数据库架构将保持不变.

缺点:

  • 每个property_data行将包含一段未知类型的数据.将它们全部存储为TEXT或BLOB,或者为单独的数据类型创建单独的列.两种解决方案看起来都很丑
  • 目前还不清楚如何从属性表中处理以前的外键.在每个插入上完成的自动数据完整性检查几乎不可能(可能使用触发器?我不确定).
  • 选择数据将变得更加困难.这些数据将被检取为property_id- property_attribute_id- valuetrinities,这是不直观,需要更多的努力才能正常输出.
  • 更重要的是,按一个或多个属性进行过滤和排序会将我带到受伤的世界.
  • 非常非常慢.
  • 感觉就像用直升机过马路一样.

坦率地说,我不喜欢这两种解决方案.但在我看来,第二个是最不丑的.你怎么看?

php mysql metadata

5
推荐指数
1
解决办法
979
查看次数

删除记录时如何删除文件?

我有一张桌子:

CREATE TABLE photo (
    photo_id BIGINT NOT NULL AUTO_INCREMENT,
    property_id BIGINT NOT NULL,
    filename VARCHAR (50) NOT NULL;
    ...
    PRIMARY KEY (photo_id),
    CONSTRAINT photo_fk_property FOREIGN KEY (property_id)
        REFERENCES property (property_id)
        ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

删除此表中的行时,也应删除其引用的文件.从此表中删除记录有两种情况:

  1. 用户删除一张特定照片.
  2. 用户删除一个特定的属性对象(如"房地产"),并自动删除引用该属性的所有照片ON DELETE CASCADE.

我知道我可以在删除属性之前选择数据库中所有引用的照片,并将它们与文件一个一个地删除,但我正在寻找替代解决方案.是否有可能捕获photo表中的记录被删除并自动删除文件的时刻,而不会重新签名该CASCADE子句,可能会以某种方式触发?

mysql

5
推荐指数
1
解决办法
2555
查看次数

表示盒子的推荐类是什么?

在食人魔,还有一类Ogre::Box看起来像它可以支持三维框.但是,此类正在使用size_t数据类型来存储其坐标.由于size_t本质上是无符号整数,因此无法处理负数,因此无法将其用于任何实数几何.我知道我可以自己保留一些数字或发明一个自制的盒子类,但是通常的Ogre方式是什么?此外,我不关心盒子是否使用整数或浮点数来存储,它只是发生在手头的任务无关紧要.

c++ 3d ogre

5
推荐指数
1
解决办法
150
查看次数