草庐IT

enable-inline-optimization

全部标签

c++ - `enable_if` 与 `enum` 模板特化问题

我在GCC编译时遇到问题enable_ifs应用于模板类方法的返回值。使用Clang,我可以在enable_if中使用表达式在enum上模板参数,而GCC拒绝编译此代码。这里是问题描述、初始代码及其后续修改,试图让我和编译器满意(不幸的是,不是同时)。我有一个非模板类Logic包含模板化类方法computeThings()它有一个enumStrategy作为其模板参数的之一。computeThings()中的逻辑取决于编译时间Strategy,所以ifconstexpr是一种合理的实现方式。变体1#includeclassLogic{public:enumStrategy{strat_

c++ - enable_if 的句法模式

我一直以这种近似的方式对各种版本的GCC(最高5.2)使用enable_if:template...>voidfn(){std::cout...>voidfn(){std::cout();fn();但是,事实证明,Clang3.7不接受这一点(“对‘fn’的调用不明确”)。Q1。谁是对的,为什么?当然还有其他方法可以做到,但我有点不喜欢templatestd::enable_if_tfa(){std::cout及其类似的方法使函数签名的正常部分更难阅读,并且template=0>voidfd(){std::cout用于涉及不相关的元素(类型和值)。Q2。还有哪些其他(正确、更易读、更少

现在允许对ConstexPR静态数据成员的重新定义? (但不是Inline Const)?

以下未能在C++14中的GCC和Clang下进行编译,但C++1Z成功:structCls{staticconstexprintN=0;};constexprintCls::N;constexprintCls::N;C++14错误是可以预见的:redefinitionof‘constexprconstintCls::N’是什么改变了这一合法?我发现:N465910.1.5[DCL.Constexpr]使用ConstexPR规范声明的函数或静态数据成员隐含是内联函数或变量所以我认为这可能与内联变量有关,但是两个编译器下的C++1Z失败structCls{staticinlineconstintN

C++-14 使用 enable_if_t 选择整数类型模板化类的成员函数

我正在尝试基于一个完整的类模板参数启用不同的成员函数,如下所示:#includetemplatestructFoo{template=0>intbar(inti)const{returni;}template=0>intbar(inti,intj)const{returni+j;}};intmain(intargc,constchar**argv){Fooa;a.bar(1);Foob;b.bar(1,2);return0;}在c++-14模式下使用gcc5,编译失败,出现如下错误:tools/t1.cpp:Ininstantiationof'structFoo':tools/t1.c

c++ - VS : unexpected optimization behavior with _BitScanReverse64 intrinsic

以下代码在Debug模式下工作正常,因为定义了_BitScanReverse64如果没有设置Bit则返回0。CitingMSDN:(返回值是)“如果设置了索引则为非零,如果未找到设置位则为0。”如果我在Release模式下编译这段代码它仍然有效,但如果我启用编译器优化,例如\O1或\O2索引不为零并且assert()失败。#include#includeusingnamespacestd;intmain(){unsignedlongindex=0;_BitScanReverse64(&index,0x0ull);cout这是预期的行为吗?我正在使用VisualStudioCommuni

c++ - 为什么这个涉及 std::enable_if 的模板元函数会产生不希望的结果?

我有一个类型特征templatestructis_binary_function:std::false_type{};及其专长templatestructis_binary_function&&!std::is_void_v&&!std::is_void_v&&function_t::isBinaryCallable,function_t>>:std::true_type{};我正在尝试识别具有公共(public)类型定义result_t、parameter1_t和parameter2_t以及静态常量的类isBinaryCallable值为true。然而,下面的代码没有输出我所期望的:

c++ - 将从唯一指针移动到共享指针也会初始化 enable_shared_from_this

当我继承std::enable_shared_from_this,但是我创建了一个unique_ptr,std::enable_shared_from_this里面的weak_ptr也会被初始化吗当我通过std::move或移动构造函数“移动”到shared_ptr时?例如下面的代码会发生什么:#include#includeclassA:publicstd::enable_shared_from_this{public:std::shared_ptrgetA(){returnshared_from_this();}};intmain(){std::unique_ptru(newA()

c++ - 为什么 MSVC 10.0 编译器经常忽略 inline 关键字?

我有一些非常复杂的c++代码,用于实时系统,因此对速度绝对敏感。它是在Linux上开发的,为了加快它的速度,许多函数都标有“内联”关键字,并移至头文件中以允许内联。现在我将此代码移植到Windows(msvc10.0、Windows7),它的运行速度大约慢了30%。在做了一些分析之后,我发现问题基本上是很多函数没有内联。当我改用“__forceinline”时,我很容易看到速度提高了10-20%。有人对此有解释吗?仅仅是因为msvc中的算法更加保守吗?还是我只是做错了什么,比如缺少配置选项? 最佳答案 您需要检查您的MSVC优化设置

c++ - 使用 std::enable_if 和可变参数基类

这是我正在尝试做的一个简化示例:#include#include#includetemplateclassfoo{public:templatetypenamestd::enable_if::value>::typebar(constU&t){std::coutclassbaz:publicfoo...{};intmain(){bazb;b.bar(1.0);}这给了我模棱两可的函数错误:error:requestformember'bar'isambiguousb.bar(1.0);note:candidatesare:templatetypenamestd::enable_if::

c++ - 使用 std::enable_if 有什么问题?

我有一个函数set_data,我必须针对它接收的不同类型以不同的方式实现它。例如,它试图根据输入类型实现两个重载。如果是基本的,非void和非nullptr_t,则在第一次实现时处理它。如果它是std::string或char缓冲区,则以第二种方式处理它。structfield{templatevoidset_data(TDataTypedata,size_tindex=0);};template::value&&std::is_same::value==false&&std::is_same::value==false>::type>voidfield::set_data(TData