c++17相关内容
在我的 C++ 旅行中,我遇到了以下习语(例如 此处 in Abseil) 用于确保模板化函数不能显式指定模板参数,因此它们不是有保证的 API 的一部分并且可以自由更改而不会破坏任何人: template void AcceptSomeReference(const T&); 它似乎确实有效: foo.cc:5:3: 错误:没有匹配的函数调用“AcceptSomeReference"Acc
..
对于下一个程序,clang++ 和 g++ 有不同的行为: #include #include 模板struct ref { 类型 &价值;};模板类型 &&get(ref const & r){返回 std::forward(r.value);}模板decltype(auto) apply_inverse(F && f, types &&... values){返
..
我在头文件中定义了一个 inline 函数对象,如下所示: //fmap.hpp命名空间 util {内联自动 constexpr fmap = boost::hana::curry(boost::hana::flip(boost::hana::transform));} 客户端代码可以简单地#include "fmap.hpp" 并开始使用 util::fmap. 到目前为止一切顺利.
..
这是constexpr 静态转换的未定义行为从 int 到作用域枚举在 C++17 中编译为非固定基础类型(作用域 枚举的相同问题).TLDR 是作用域枚举始终具有固定的基础类型(默认情况下为 int,因此您始终可以从 int 转换为作用域枚举). 我想知道以下内容是否应该在 C++17 中编译 enum E{甲、乙};constexpr Ex = static_cast(2); 这在
..
我有一个带有 transposedView() 方法的矩阵类,我多年来一直使用它作为“零开销";行向量和列向量之间的转换. template结构垫{std::array缓冲;//...模板>const mat
..
在 C++17 中,我知道我可以写: #include 结构体A{size_t operator()(double x) const { return 1;};};int main(){static_assert(std::is_invocable_r_v);} 但是现在我想使用 std::is_invocable 来测试任意方法的存在(这里是 size(double) 方法): #incl
..
我有一个包含 unique_ptr 的对象,因此如果不进行深度复制(我不想要),就无法复制构造. 我想让 std::any 持有那个对象,但我发现的唯一替代方法是让 std::any 持有一个指针,这会增加一个无用的间接,或者让我的对象有一个唯一的点.下面的代码有望说明我的观点: //用clang++编译-std=c++2a;叮当版 5.0.0#include #include #incl
..
我有一个枚举类,例如: 枚举类状态{S1,S2,S3,S4}; 每当我进行可能使用此类的 switch/case 语句时,我都希望避免使用“默认"语句.不惜一切代价强迫我为所有可能的情况写一份声明.这个想法是,如果我在这个枚举中添加一个新案例“S5",由于缺少默认值,编译器将在每次切换时向我发送警告,因为并非所有案例都被涵盖.通过这样做,我最终不会忘记这个新状态可能需要实现特定行为的地方.
..
我无法理解如何在 C++17 中使用 std::variant.给定两个结构体 A 和 B,以及一个 std::vector>vs,我想: 引用一个通用的结构体成员,例如n; 调用一个通用函数,例如fun() 或 add(). #include #include #include 结构体{国际n;void fun() { std::cout
..
据我所知,std::invoke 允许我执行以下操作: std::invoke(f, arg1, arg2, ...); 有没有比简单地做更有利的场景: f(arg1, arg2, ...); 解决方案 如果 invocable 是指向成员函数的指针,那么您需要执行以下操作之一: (arg1->*f)(arg2,...);(arg1.*f)(arg2,...); 取决于 arg1 是
..
在 SFML 中转换精灵,不考虑它的新来源. 在我的例子中,sf::Sprite 围绕左上角 ({0,0}) 的轴旋转,不管它的原点是什么.之前使用 .setOrigin() 设置新原点无效. 我确信精灵更早地获得了正确的原点位置,即矩形的中心. 我的代码: 在我的每个 Card 类构造函数中,我都设置了我的精灵的原点. card_sprite.setOrigin(Car
..
我正在尝试为竞争性编程建立一个环境.我已经成功安装了带有 sublime 3 的 mingw 64.我的代码能够在控制台中打印 hello world.但是,我无法将输入和输出读入输入和输出文件.我正在按照此处的说明进行操作,并且这是我试图运行的 C++ 代码. #include使用命名空间标准;int main(){#ifndef ONLINE_JUDGEfreopen(“input.txt"
..
当给定以下结构的代码时 template void foo(Args&&... args) { ... } 我经常看到库代码在函数内使用 static_cast 进行参数转发.通常,这样做的理由是使用 static_cast 避免了不必要的模板实例化. 给定语言的参考折叠和模板推导规则.我们通过 static_cast 获得了完美的转发,此声明的证明如下(在误差范围内,我希
..
考虑: void foo(std :: string& s); 在此函数内,表达式 s 是 lvalue std :: string ( not std:: string& ),因为引用并不是真正的“存在";在表达式中: [expr.type/1] :如果表达式最初的类型为“对 T 的引用" ([dcl.ref],[dcl.init.ref]),则该类型在进行任何进一步分析之前,已将
..
结构化绑定使遍历具有如下范围的for循环的地图的迭代更加清晰易读 表示(自动[键,值]:映射){cout
..
我遇到一个问题,可以归结为以下问题:即使应该失败,也会编译 == 运算符用法(C ++ 17,已在GCC 5上进行了测试).x,8.x和9.x): 模板结构物{运算符const char *()const {return nullptr;}布尔运算符==(const事物一种;事物
..
请考虑以下类集及其操作符的关系:我们可以通过两种不同的方式来实现它们.第一个是在类内定义运算符,第二个是在类外定义运算符... template结构A {T值夯;运算子+(const A T& other){返回值+ other.value;}//其他运算符};temlate结构B {T值夯;运算符+(const B T& other){返回
..
在C/C ++中, switch/case 仅将整数类型与编译时间常数进行比较.不能使用它们将用户/库定义的类型(如 std :: string )与运行时值进行比较.为什么switch语句不能应用于字符串? 我们是否可以实现相似的 switch/case ,它给出类似的语法糖,并避免普通的 if/else 比较. struct X {std :: string s;布尔运算符==(co
..
这些天,我一直在研究一个数据模型的项目研究,该模型具有一种适合我的需求的反映.当我使用最新的稳定版g ++进行我的第一篇研究时,我在Visual Studio 19中失败了.太糟糕了,因为后者是我的主要平台…… 有效地,我尝试将指向成员变量的指针存储到另一个静态成员变量中.因此,对我来说,真正进行此内联(以适应我的更大概念)确实很理想. 我将失败的细节简化为以下MCVE: stru
..
我注意到将我的CMake项目与gcc 8.3链接失败,无法链接std :: filesystem中的函数.gcc 9,clang 7或clang 8并非如此. 我发现了此和
..