c++11 相关问题

将此标记用于必须编译为C ++ 11的代码(不使用C ++ 14或更高版本中引入的任何功能)。

强制 C++ 类具有不对齐的成员

考虑这个类: C3级 { 民众: uint16_t p1; uint16_t p2; uint8_t p3; }; sizeof(C3) 是 6。是否有任何编译器例程可以绕过对齐并强制其大小为 5?我试过了...

回答 2 投票 0

C++ 运算符中的参数类型转换如何工作?

我正在创建一个新类 VarDbl,其中包含一些显式构造函数以及 + 运算符: 类 VarDbl { ... 显式 VarDbl(双值,双不确定性); 显式 VarDbl(

回答 1 投票 0

如何简化这些函数模板特化?

我正在处理一些遗留代码,这些代码在头文件中定义了以下模板: 模板 std::string ConvertToString(const T& t); 在同一个头文件中,有

回答 1 投票 0

解压 std::array

我尝试通过 std::tie 解压 std::array: #包括 #包括 int main() { std::array arr = {1, 2, 3}; 整数a、b、c; std::tie(a, b, c) = arr;...

回答 2 投票 0

如何通过字符串名称访问结构体属性?

我有一个结构: typedef 结构体勾选 { 双开; 双高; 双低; 双关; 双 ema100; } 打钩; 我想访问给定密钥的属性: 勾选当前T...

回答 5 投票 0

std::atomic<X>::value_type 发生了什么?

根据本参考手册 对于每个 std::atomic (无论是否专用), std::atomic::value_type 都是 X。 但如果我尝试使用此类类型,则会出现编译错误。 ...

回答 2 投票 0

类模板:导致诊断错误的默认构造函数参数。是未定义的行为吗?

在开发一个库时,我发现了一个可以总结为以下代码片段的代码: 结构主流{}default_stream,custom_stream; 结构 Stream2{} custom_stream2; 模板 在开发一个库时,我发现了一个可以在此片段中总结的代码: struct MainStream{} default_stream, custom_stream; struct Stream2{} custom_stream2; template <class StreamSelection> class Manage { public: Manage(StreamSelection & out_stream = default_stream){ // do something }; }; void test(void) { Manage <MainStream> s1_a; //ok: use default_stream Manage <MainStream> s1_b(default_stream); //ok: use default_stream Manage <MainStream> s1_c(custom_stream); //ok: use custom_stream Manage <Stream2> s2_a(custom_stream2); //ok: use custom_stream2 //Manage <Stream2> s2_b; //diagnostic error if uncommented due the incompatible default argument. } 此类构造函数的目的是在使用 MainStream 实例化模板时提供默认参数,并且在未提供构造函数参数的情况下强制对其他参数产生诊断错误,并且还避免任何额外的模板专门化来实现目的。 也就是说,该代码片段可以按预期使用 GCC (-std=c++11 -pedantic -Wall -Wextra)、CLANG 和 MSVC 进行编译和工作。 不考虑代码风格,问题是:这件事是否涉及未定义的行为? 我能在 ISO 论文 N3337(最终的 C++11 工作草案)第 14.7.1 第 3 点找到的唯一参考: 除非调用是对函数模板显式特化或 显式专用类模板的成员函数, 函数模板或成员函数的默认参数 类模板在调用函数时隐式实例化 在需要默认参数值的上下文中。 但我不确定这个匹配(问题是关于默认参数的类型,而不是它的实例。) 有什么建议吗? 编辑:澄清一下,当使用“MainStream”以外的参数实例化类时,忽略的默认参数无论如何都有不兼容的类型。 [temp.inst/1] 类模板特化的隐式实例化会导致声明的隐式实例化,但不会导致类成员函数的定义或默认参数... 强调我的。再加上您已经找到的段落: [temp.inst/3] .. 当在需要默认参数值的上下文中调用函数时,函数模板或类模板的成员函数的默认参数将被隐式实例化。 这些规则旨在通过尽可能晚地推迟默认参数的实例化来使代码像您的工作一样,希望不需要它。

回答 1 投票 0

推导函数指针返回类型

我认为代码可以更好地说明我的需求: 模板 结构返回类型 { 类型定义???类型; }; 以便: return_type::类型 -> int 返回类型 我认为代码会更好地说明我的需求: template <typename F> struct return_type { typedef ??? type; }; 这样: return_type<int(*)()>::type -> int return_type<void(*)(int,int)>::type -> void 我知道 decltype 和 result_of 但他们需要通过参数。我想从单个模板参数推断函数指针的返回类型。我无法将返回类型添加为参数,因为这正是我想在此处隐藏的内容... 我知道boost中有一个解决方案,但我无法使用它,并且尝试从boost中挖掘它导致了巨大的失败(就像经常发生的那样)。 欢迎使用 C++11 解决方案(只要 VS2012 支持)。 如果您可以使用可变参数模板(12 年 11 月 CTP),这应该可以工作: template <class F> struct return_type; template <class R, class... A> struct return_type<R (*)(A...)> { typedef R type; }; 实例. 如果您无法使用可变参数模板,则必须为 0、1、2、... 参数提供特定的专业化(手动或预处理器生成)。 编辑 正如评论中所指出的,如果您还想使用可变参数函数,则必须添加一个额外的部分专业化(或者在无可变参数模板情况下为每个参数计数一个): template <class R, class... A> struct return_type<R (*)(A..., ...)> { typedef R type; }; 提问已经有一段时间了。对于 C++17,有一个有趣的选项(使用关键字 auto)。然而,语法与最初要求的有点不同,但结果(类型)是相同的。 首先,我们需要一个辅助函数。正如您在此处看到的,该函数接受一个函数指针并返回一个 R 类型的对象。我们仅在 decltype 语句中需要它,因此该函数永远不会被调用,因此前向声明就足够了。 template<typename R, typename... ARGS> static R return_type(R (*)(ARGS...)); // forward declaration only for decltype 技巧是提供函数指针作为模板自动参数,该参数被转发到 decltype 语句: template<auto FUNCTION_POINTER> using ReturnType = decltype(return_type(FUNCTION_POINTER)); 现在很容易获取返回类型了: #include <iostream> #include <type_traits> template<typename R, typename... ARGS> static R return_type(R (*)(ARGS...)); // forward declaration only for decltype template<typename R, typename... ARGS> static R return_type(R (*)(ARGS..., ...)); // overloaded variant for functions with C-ellipsis template<auto FUNCTION_POINTER> using ReturnType = decltype(return_type(FUNCTION_POINTER)); int func1(char c, int i, long l); // also here only forward declarations needed void func2(unsigned u, float f); double func3(bool b); bool func4(int, ...); int main() { std::cout << std::is_same_v<int, ReturnType<func1>> << std::endl; std::cout << std::is_same_v<void, ReturnType<func2>> << std::endl; std::cout << std::is_same_v<double, ReturnType<func3>> << std::endl; std::cout << std::is_same_v<void, ReturnType<func1>> << std::endl; std::cout << std::is_same_v<void, ReturnType<func4>> << std::endl; std::cout << std::is_same_v<bool, ReturnType<func4>> << std::endl; } 您可以在 Wandbox 中尝试完整的示例: https://wandbox.org/permlink/sKemxB44dgAVDlP6 示例中的更新:C 省略函数的重载助手。我将其用于多个 glibc 库函数。

回答 2 投票 0

如何从包含字符串消息向量的 uint8_t 向量中提取特定数据

我想从包含向量中的字符串的向量中提取数据。我要提取的数据部分是十六进制数字。从...中提取数据会更容易

回答 1 投票 0

unordered_map:find() 和 count() 哪个更快?

确定 unordered_map 容器是否包含具有指定键的项目的最快方法是什么?

回答 4 投票 0

std::make_tuple 不进行引用

我一直在尝试将 std::tuple 与参考文献结合起来: #包括 #包括 int main() { 整数a,b; std::tuple 测试(a,b); ...

回答 6 投票 0

在 Windows 11 上使用 Visual Studio 的全屏控制台窗口

SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, SC_MAXIMIZE, 0); 我一直在 int main() 的开头使用这行代码来使控制台窗口全屏显示,并且它可以在我的计算机上运行...

回答 1 投票 0

内联汇编器的字符串化模板类型

我正在寻找一种通过模板函数自动执行 gcc 内联汇编调用的方法。 例如,我有以下虚拟函数将值存储到指针中。现在我专注于技术...

回答 1 投票 0

这个语句中的 thresh 是什么?

我正在尝试在C++中执行与Python编写的一些代码相同的操作。 在以下链接中: 如何自动检测和裁剪精灵表中的单个精灵边界? 阈值 = cv2.阈值(...

回答 1 投票 0

为什么我可以在 constexpr 函数内调用非 constexpr 函数?

考虑以下代码: #包括 constexpr int f() { return printf("副作用! ”); } int main() { 字符a[f()]; printf("%zd ",a) 的大小; } 我会有前...

回答 2 投票 0

从二叉树中删除节点

我试图用C++实现二叉树,但是我的deleteNode函数无法正常工作。我的deleteNode 函数有什么问题? 模板 类树节点{ 民众:

回答 1 投票 0

哪些std类型在移动构造函数中用作arg后保证为空/null

我知道shared_ptr,unique_ptr,weak_ptr在用作相同类型的构造函数中的右值引用参数后保证为空,但我想知道标准是否为某些其他指定了这一点...

回答 2 投票 0

有关通过 std::atomic_flag 实现自旋锁互斥锁的问题

我目前正在阅读一本名为《C++ concurrency in action》的书。有一个自旋锁互斥实现的例子: 类 spinlock_mutex { std::atomic_flag 标志; 民众: 自旋锁_互斥体(): 标志(ATOMIC_FLA...

回答 1 投票 0

如何生成第n个仅由偶数组成的数字?

我是编程新手。我可以找到由偶数组成的数字,但我的算法复杂度是 O(n)。对于大的 n 我的算法太慢了。所以我需要一个更高效的算法。任何人都可以...

回答 2 投票 0

从二叉树中删除节点

我试图用c++实现二叉树,但我的deleteNode函数无法正常工作。我的deleteNode 函数有什么问题? 模板 类树节点{ 民众: ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.