当前位置: 首页 > 知识库问答 >
问题:

平凡类型的类型特征

华誉
2023-03-14

我希望有一个类型特征,对于任何在使用前不需要内存初始化的类型返回true,并且其复制构造函数可以作为memcpy实现。

我想让它回到真实

    < li >整数类型(char、short int、int、long int等) < li >浮点数类型(float,double) < li>il::array (il::array是我自己对std::array的实现)for T是int、double、il::array等中的一个。

对于std::vector和任何在构造时需要某些东西对象(大多数对象)则为false。

std::is_pod似乎非常接近我想要的,因为它对于std::array也返回true,但不幸的是,对于我自己的il::array,它没有返回true。有没有任何方法可以“教导”Is_pod我的il::数组表现为普通的旧数据,或者有一种简单的方法来推出我自己的类型特性?

有关信息,这里是我的il::array实现:

namespace il {

template <typename T, int n>
class array {
private:
    T data_[n > 0 ? n : 1];
public:
    array(const T& value)
            : array() {
        for (int k = 0; k < n; ++k) {
            data_[k] = value;
        }
    }
    array(std::initializer_list<T> list) {
        IL_ASSERT(n == static_cast<int>(list.size()));
        for (int k = 0; k < n; ++k) {
            data_[k] = *(list.begin() + k);
        }
    }
    const T& operator[](int k) const {
        IL_ASSERT(static_cast<unsigned int>(k) < static_cast<unsigned int>(n));
        return data_[k];
    }
    T& operator[](int k) {
        IL_ASSERT(static_cast<unsigned int>(k) < static_cast<unsigned int>(n));
        return data_[k];
    }
    T* data() {
        return data_;
    }
    int size() const {
        return n;
    }
};

}

共有1个答案

景辰钊
2023-03-14

我希望有一个类型特征,对于任何在使用前不需要内存初始化的类型返回true,并且其复制构造函数可以作为memcpy实现。

您正在描述一种微不足道的类型。您可以使用std::is_trivial进行检查。

< code>std::is_pod似乎与我想要的非常接近

这也要求类型具有标准布局,这就限制了其数据成员的声明方式和位置。

不幸的是,它不会为我自己的 il::array 返回 true

也许这不是标准布局,在这种情况下< code>is_trivial应该适合您。或者也许它在任何情况下都不是微不足道的。在这种情况下,您可能想要修复它,使它成为。

更新:它有一个用户声明的默认构造html" target="_blank">函数,这使得它非常重要。因为它只检查编译时间常数的值,所以可以用<code>static_assert</code>替换它;或者将n更改为更合理的无符号类型,如std::size_t,以消除对健全性检查的需要。

但是你仍然需要声明它是违约的

array() = default;

否则其他构造函数的存在会删除它。

有什么方法可以“教导”< code>is_pod我的< code>il::array表现为普通的旧数据?

你可以写你自己的特点,针对你的类型进行专门化。但那会很奇怪;如果你的类型应该是琐碎的或POD,那么就让它成为琐碎的。

 类似资料:
  • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

  • 我有一个有界泛型类,我们称之为泛型,它的参数T扩展了抽象类abstract: 泛型类: 抽象类 泛型类中T引用的类 当尝试引用方法 getMap() 时,该方法来自 T 边界内的类(并且根据抽象类定义,T 的所有可能实例都将具有该方法),我收到以下错误: 不能从静态上下文引用非静态方法getMap() 然而,任何地方都没有静态关键字。我错过了什么?? 谢谢!

  • 这个问题是在泛型关联类型在Rust中可用之前提出的,尽管它们是被提出和开发的。 我的理解是,特征泛型和关联类型在它们可以绑定到结构的类型数量上有所不同。 关联类型仅绑定1个类型: 泛型关联类型是这两种类型的混合。它们绑定到一个类型,正好有一个关联的生成器,而生成器又可以关联任何数量的类型。那么前面示例中的和这个泛型关联类型有什么区别呢?

  • 我是新手。我正在开发一个测验应用程序,并拥有以下三个dart文件: 主要的飞奔 question.dart answer.dart 当我在android studio中的android上运行应用程序时,出现以下错误: ══╡ 小部件库捕获的异常╞═══════════════════════════════════════════ 生成MyApp时引发了以下类型的错误(脏,状态:_MyAppSta

  • 在存储到本地数据库之前,将字符串转换为对象的正确方法是什么? 这是的输出: 我试图将其转换为CreatedBy对象 创造的 这里是我的本地表列 错误

  • 我正在开发一个依靠API REST调用的flutter应用程序。来自API的响应有点复杂。当调用我的API(例如:api/产品)时,我可以从日志中看到响应:但是我有这个错误: 类型列表 StackTrace: [更新]:退货产品响应。fromJson(response)而不是response ProductsRespository: ProductsBloc: 回应: ApiProvider: 模