c++14 相关问题

C ++ 14是2014年批准的C ++标准的名称。它基于以前的C ++ 11标准,改进了核心语言和标准库并添加了一些功能。

获取模板中的函数返回类型

如何获取传递给模板的任何函数的返回类型? 我不知道如何在 template 和 template 之间进行转换: 模板 如何获取传递给模板的任何函数的返回类型? 我不知道如何在 template<typename T> 和 template<typename Result, typename Args...> 之间转换: template<typename T> void print_name(T f) { static_assert(internal::is_function_pointer<T>::value || std::is_member_function_pointer<T>::value, "T must be function or member function pointer."); typename decltype(f(...)) Result; // ??? typename std::result_of<T>()::type Result; // ??? printf("%s\n", typeid(Result).name()); } void f_void() {} int f_int(int x) { return 0; } float f_float(int x, int y) { return 0.f; } struct X { int f(int x, float y) { return 0; } }; int main() { print_name(f_void); print_name(f_int); print_name(f_float); print_name(&X::f); return 0; } 我如何在函数Result中获取类型print_name? 一个可能的解决方案是使用函数声明来提取返回类型以及所有参数。你甚至不需要定义它。 它遵循一个最小的工作示例: #include<typeinfo> #include<cstdio> template<typename R, typename... A> R ret(R(*)(A...)); template<typename C, typename R, typename... A> R ret(R(C::*)(A...)); template<typename T> void print_name(T f) { printf("%s\n", typeid(decltype(ret(f))).name()); } void f_void() {} int f_int(int x) { return 0; } float f_float(int x, int y) { return 0.f; } struct X { int f(int x, float y) { return 0; } }; int main() { print_name(f_void); print_name(f_int); print_name(f_float); print_name(&X::f); return 0; } 如您所见,为ret提供的声明与提交的函数或成员函数具有相同的返回类型。 剩下的由 decltype 完成。 从 C++ 17 开始,答案是 std::invoke_result_t<T>

回答 2 投票 0

这是 std::quote bug 的行为吗?

我想用自定义类型做与 std::quote 相同的事情,但我想错过使用这种具有临时右值的 API。经过一番使用 std::quoted 后,我发现了以下内容......

回答 2 投票 0

如何序列化/反序列化派生类的 unordered_map 成员

所以我正在用 C++ 构建一个模拟文件系统,以更好地研究该语言,也许还可以进行一些系统级编程。我使用 Boost::Serialization 来保存文件系统的状态,当用户...

回答 1 投票 0

用可变参数替换模板参数列表

有人可以帮助我如何用可变参数模板参数替换模板类型列表,并在类中创建每种类型的唯一指针。 问题是我有课 模板...

回答 1 投票 0

C++ 中向量 STL 的 size() 函数与 INT_MIN 相比给出了意想不到的结果

#包括 使用命名空间 std; int main() { 向量 v = {1,2,3}; int maxi = INT_MIN; if(v.size() > maxi) 计算<<"YES"<<&q...

回答 2 投票 0

如何在编译时重复连接字符串?

我编写了以下在编译时使用字符串的代码: 模板 结构体 CnstString { 模板 使用push_back = CnstString 我编写了以下代码以在编译时使用字符串: template<char... Chars> struct CnstString { template<char... Aped> using push_back = CnstString<Chars..., Aped...>; constexpr static char value[] = {Chars...}; }; 我这样使用就可以了: #include <iostream> using str = CnstString<'H', 'e', 'l', 'l', 'o', '\0'>; int main() { std::cout << str << std::endl; return 0; // it will output "Hello" } 我想做的是使用递归模板结构体,在编译时拼接上面代码给出的字符串,并在递归终点处向数组追加一个'\0'。 我写这段代码的原因是因为我想多次连接同一个字符串。显然我不能像"Hello""Hello"那样将相同的字符串连接在一起。 递归模板结构如下所示: template<int N, typename Str> struct RepeatStr { using ret = RepeatStr<N-1, Str>; // this is an error, I don't know how to pass parameters }; template<typename Str> struct RepeatStr<-1, Str> { using ret = Str::push_back<'\0'>; }; 但是,我发现我不知道如何使用Str中的字符向自身追加字符。 有什么问题吗?或者它根本不可能在编译时完成? 您需要在 using 声明中添加关键字 template 来告诉编译器 push_back 使用模板。 template<int N, typename Str> struct RepeatStr { using ret = RepeatStr<N-1, Str>; }; template<typename Str> struct RepeatStr<-1, Str> { //--------------------vvvvvvvv------------------->works now using ret = Str:: template push_back<'\0'>; }; 工作演示

回答 1 投票 0

Codility 的 MinAvgTwoSlice 挑战 - C++

我正在尝试解决Codility第5课中的MinAvgTwoSlice问题,但我似乎找不到我的代码有什么问题。总体思路是,给定一个整数数组,必须找到

回答 1 投票 0

如何初始化与类具有相同类型的类的静态常量成员?

我有一个类,其静态常量成员与该类具有相同的类型。我收到一个错误,表明课程尚未完成。 #包括 类别 颜色 { 民众: 颜色(无符号字符

回答 1 投票 0

decltype(auto) 有哪些用途?

在 c++14 中引入了 decltype(auto) 习惯用法。 通常,它的用途是允许自动声明在给定表达式上使用 decltype 规则。 寻找“良好”用法的示例...

回答 2 投票 0

如何将函数模板参数限制为特定类模板的特化

我的结构如下: 模板 类模板类 { ... }; 模板 类 UsesTemplateClass { 民众: UsesTemplateClass( TClass...

回答 3 投票 0

如何将函数模板参数限制为特定类模板的特化

我的结构如下: 模板 类模板类 { ... }; 模板 类 UsesTemplateClass { 民众: UsesTemplateClass( TClass...

回答 3 投票 0

在 C++14 中将模板参数限制为类的最佳方法是什么?

我的结构如下: 模板 类模板类 { ... }; 模板 类 UsesTemplateClass { 民众: UsesTemplateClass( TClass...

回答 1 投票 0

如果在其他人提供的库的标头中附加更多枚举是否有任何潜在问题?

如果在其他人提供的共享库的标头中附加更多枚举,我应该注意什么潜在问题吗?该库的代码无法修改...

回答 1 投票 0

有没有办法使用基于范围的 for 循环迭代最多 N 个元素?

有没有一种很好的方法可以使用基于范围的 for 循环和/或标准库中的算法来迭代容器中最多 N 个元素(这就是重点,我知道我可以使用 &qu...

回答 10 投票 0

如何在表达式中触发 std::shared_ptr 的 bool 运算符(即 `bool is_empty = cur_front_res && cur_back_res;` )?

既然cur_front_res和cur_back_res都是shared_ptr,那么std::shared_ptr的bool运算符如何在表达式中触发(即bool is_empty = cur_front_res && cur_back_res;)?...

回答 1 投票 0

如何初始化 std::pair 的 constexpr std::array <int, const char[]>?

在 C++14 中,如何初始化包含文本字符串的 std::pair 的全局 constexpr std::array?以下不起作用: #包括 constexpr std::array 在 C++14 中,如何初始化包含文本字符串的 std::array 的全局 constexpr std::pair?以下不起作用: #include <array> constexpr std::array<std::pair<int, const char[]>, 3> strings = { {0, "Int"}, {1, "Float"}, {2, "Bool"}}; 你就快到了。首先,char const[]类型需要是一个指针,因为它是一个不完整的类型,可能无法保存在std::pair中。其次,你缺少一对牙套。正确的声明将如下所示: constexpr std::array<std::pair<int, const char*>, 3> strings = {{ {0, "Int"}, {1, "Float"}, {2, "Bool"}, }}; 需要额外的大括号,因为 std::array 是保存原始 C 数组的聚合,因此我们需要显式提到的大括号,以便 {0, "Int"} 不会被错误地视为内部数组对象的初始化程序。 C++20 中的另一种选择是使用 std::to_array,它允许您创建一个不需要预先指定大小的数组。 constexpr auto strings = std::to_array<std::pair<int, const char*>>({ {0, "Int"}, {1, "Float"}, {2, "Bool"}, });

回答 2 投票 0

当共享托管对象永远不会同时被评估时,在生产者和消费者之间使用 std::shared_ptr 是否安全?

下面是演示代码片段。 由于 std::shared_ptr 本身是线程安全的并且托管对象永远不会被生产者和消费者同时访问,因此可以删除互斥锁吗? #

回答 1 投票 0

如何执行气灵规则来尝试OR条件下的所有规则?

我正在尝试解析这个命令模板,它可以采用以下内容: SendCmd SomeCommand Left_Side = "某些值"; SendCmd AnotherCmd "Some Literal" = Some_Value; SendCmd Anot...

回答 1 投票 0

c++14 std::experimental::filesystem::v1 和 c++17 std::filesystem 之间的区别?

我找到了这个页面,描述了c++14和c++17之间的变化: https://isocpp.org/files/papers/p0636r0.html ...它链接到此页面,该页面描述了建议的文件系统更改: http://...

回答 2 投票 0

const void 返回类型的含义是什么?

std::is_void 的描述指出: 提供等于 true 的成员常量值,如果 T 的类型为 void、const void、volatile void,或 const 挥发性无效。 那会是什么

回答 3 投票 0

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