相关但比 C++11 static assert for equality comparable type? 神秘得多—
JF Bastien 的论文 N4130 "Pad Thy Atomics!"让我想到如果我们要使用 atomic<T>::compare_exchange_weak()其中 T是类或者结构类型,比如
struct Count {
int strong_count;
int weak_count;
};
然后我们真的想静态断言两件事:
首先,T实际上是无锁原子的:
template<class T>
static constexpr bool is_lockfree_atomic_v =
std::atomic<T>::is_always_lock_free;
其次,compare_exchange_weak会做我们想做的。回想一下(或来自 N4130)compare_exchange_weak根据 memcmp 定义和 memcpy .所以我们需要检查这些函数是否会在 T 之前做正确的事情。关注点:
template<class T>
static constexpr bool is_cmpxchgable_v =
std::is_trivially_copyable_v<T> &&
is_trivially_equality_comparable_v<T>;
is_trivially_copyable_v由STL提供。但是我们没有 is_trivially_equality_comparable_v然而——遗憾的是,我的理解是P0515 Consistent Comparison不建议提供一个。 (P0515 是允许编译器检测相等运算符字面上“微不足道”的特性——它不是用户提供的,并且在某某条件下明确默认。但是,它没有引入任何核心语言中的新概念,例如“平凡可比”。)
我对“平凡可比”特征的最佳尝试是这样的:
template<class T, class U>
static constexpr bool is_equality_comparable_with_v =
requires(std::declval<T>() == std::declval<U>());
template<class T>
static constexpr bool is_equality_comparable_v =
is_equality_comparable_with_v<T, U>;
template<class T>
static constexpr bool is_trivially_equality_comparable_v =
is_equality_comparable_v<T> &&
std::has_unique_object_representations_v<T>;
但是,这个定义依赖于std:: has_unique_object_representations_v , [EDIT: which has undefined behavior 其值与 operator== 的行为无关] 当 T不是标量类型。我强烈怀疑在实践中 has_unique_object_representations_v将为结构类型返回垃圾,例如我原来的 Count类型。
struct Yes { int a; int b; };
struct No { short a; int b; };
using Yes2 = std::tuple<int, int>;
struct No2 { int a; int b; bool operator==(const No2&) { return true; }};
has_unique_object_representations还没有。has_unique_object_representations然而,据我所知。has_unique_object_representations_v<Yes> ,甚至正确报告 not has_unique_object_representations_v<No> , 但错误地报告 not has_unique_object_representations_v<Yes2>那has_unique_object_representations_v<No2> .所以我的问题是,(1) 是否有更好的方法来测试“琐碎的可比性”? (2) 是否有关于 is_trivially_equality_comparable 的提案方向的任何动向(和 is_trivially_less_than_comparable 等等),如果 P0515 进入 C++20 的标准? (3) 应该有吗?
最佳答案
我想你想要has_padding_bits。 p0528 详细解释了原因。简而言之,您在 memcpy 和 memcmp 上完全正确!
jackson 维尔 session 前的 session 上将有一篇更新的论文。
2018 年年中更新
标准委员会决定使用 p0528 朝另一个方向发展,而是让带有填充位的类型的 cmpxchg Just Work。对于 p0528 想要解决的问题,不会有 has_padding_bits。
目前您的问题没有好的答案:-)
关于c++ - std::is_trivially_equality_comparable_v<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742127/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d
我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`
我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10
考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://