我是因为this question才知道这个的,标准规定为 std::complex (26.4 [复数]):
4 If
zis an lvalue expression of type cvstd::complex<T>then:
— the expressionreinterpret_cast<cv T(&)[2]>(z)shall be well-formed,
—reinterpret_cast<cv T(&)[2]>(z)[0]shall designate the real part ofz, and
—reinterpret_cast<cv T(&)[2]>(z)[1]shall designate the imaginary part ofz.
Moreover, ifais an expression of type cvstd::complex<T>*and the expressiona[i]is well-defined for an integer expressioni, then:
—reinterpret_cast<cv T*>(a)[2*i]shall designate the real part ofa[i], and
—reinterpret_cast<cv T*>(a)[2*i + 1]shall designate the imaginary part ofa[i].
这是我真正想要以符合标准的方式利用的东西。有时我有 POD,比如数学 vector ,它们由单一数据类型组成。下面是两个示例类:
template <typename T, unsigned N>
struct Vector
{
T v[N];
};
template <typename T>
struct Quaternion
{
T r, i, j, k;
};
据我了解,允许在最后一个成员之后以及成员之间添加填充。这意味着 sizeof(Quaterntion<float>)可能不等于 sizeof(float[4]) , 和 sizeof(Vector<double, 8>)可能不等于 sizeof(double[8]) .这意味着我通常必须添加一些 static_assert s 到我的代码以确保我可以转换我的 Vector<float, N>/Quaterntion<float>到 float* ,例如,不用担心填充(例如,为了传递给 C 库或 OpenGL 缓冲区)。
是否有标准提供的一些方法可以让我对我的小 POD 有相同的保证,比如 Vector和 Quaternion , 作为 std::complex做?我知道特定于实现的事情,比如 __attribute__((packed)) .我正在寻找一种非特定于实现的、符合标准的方法来执行此操作。由于标准要求为提供 std::complex 的实现支持此类事物,我想知道是否还有一些标准方法可以将此保证应用于我自己的类(class)。
最佳答案
我认为你在问不可能的事情。
请记住,标准库实现者通常依赖于非标准扩展或实现定义的行为。事实上,在 VC++ 的复杂头文件中我们发现:
#pragma pack(push, _CRT_PACKING)
// implementation
#pragma pack(pop)
您可以为四元数做的是将所有成员放在一个数组中,因为结构地址可以重新解释为指向第一个成员的指针。但我想这违背了结构的目的(通过名称直接访问成员)。
这不是你所要求的,而是提供一个
operator const T*() const // can be written in a portable manner
对于你的结构,将允许你写
Quaternion<double> q = {};
const double * p = q;
以额外的运行时/内存开销为代价,具体取决于您如何实现转换运算符。
关于c++ - 我怎样才能让我的对象重新解释为数组,比如 std::complex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22925905/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
这似乎应该有一个直截了当的答案,但在Google上花了很多时间,所以我找不到它。这可能是缺少正确关键字的情况。在我的RoR应用程序中,我有几个模型共享一种特定类型的字符串属性,该属性具有特殊验证和其他功能。我能想到的最接近的类似示例是表示URL的字符串。这会导致模型中出现大量重复(甚至单元测试中会出现更多重复),但我不确定如何让它更DRY。我能想到几个可能的方向...按照“validates_url_format_of”插件,但这只会让验证干给这个特殊的字符串它自己的模型,但这看起来很像重溶液为这个特殊的字符串创建一个ruby类,但是我如何得到ActiveRecord关联这个类模型
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser