Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

1
在std :: vector :: erase()和std :: deque :: erase()中复制/移动分配
在回答的过程中的另一个问题,我偶然发现稍有不同的措辞为std::vector::erase()和std::deque::erase()。 这就是C ++ 14关于std::deque::erase([deque.modifiers]/4-6,重点是我的)的看法: 效果: ... 复杂性:析构函数的调用数与擦除的元素数相同,但是对赋值运算符的调用数不超过擦除的元素之前的元素数量和删除元素之后的元素数量中的较小者。擦除的元素。 抛出:除非的复制构造函数,move构造函数,赋值运算符或move赋值运算符抛出异常,否则什么都不会发生T。 它是关于std::vector::erase([vector.modifiers]/3-5)的内容: 效果: ... 复杂性:的析构函数的T调用次数等于擦除的元素数,但是的移动分配运算符的T调用次数等于在擦除的元素之后向量中的元素数。 抛出:除非的复制构造函数,move构造函数,赋值运算符或move赋值运算符抛出异常,否则什么都不会发生T。 如您所见,它们的异常规范是相同的,但是std::vector明确提到了调用移动赋值运算符。 还有的要求T是MoveAssignable对erase()与这两个工作std::vector和std::deque(表100),但这并不意味着移动赋值运算符的存在:一个可以定义一个拷贝赋值运算符,而不是定义移动赋值操作符,而这个班会是MoveAssignable。 为了以防万一,我检查了GCC和Clang,并确实std::vector::erase()在没有移动分配运算符的情况下调用了复制分配运算符,并且std::deque::erase()执行了同样的操作(DEMO)。 所以问题是:我错过了什么吗,或者这是标准中的(编辑)问题? 更新: 我已经提交了LWG问题#2477。

13
如何将元组扩展为可变参数模板函数的参数?
考虑带有可变参数模板参数的模板化函数的情况: template<typename Tret, typename... T> Tret func(const T&... t); 现在,我有了一个t价值元组。如何func()使用元组值作为参数调用?我已经阅读了有关bind()函数对象,call()函数以及apply()其他一些过时文档中的函数。GNU GCC 4.4实现似乎call()在bind()该类中具有一个功能,但是关于该主题的文档很少。 有人建议使用手写递归黑客技术,但是可变参数模板参数的真正价值在于能够在上述情况下使用它们。 有没有人对is有解决方案,或暗示在哪里可以找到它?
135 c++  c++11  arguments  tuples 

6
使用C ++ 11随机库生成随机数
如标题所示,我正在尝试找到一种使用新的C ++ 11 <random>库生成随机数的方法。我已经用以下代码尝试过: std::default_random_engine generator; std::uniform_real_distribution<double> uniform_distance(1, 10.001); 我的代码存在的问题是,每次我编译并运行它时,它总是生成相同的数字。所以我的问题是,在真正随机的情况下,随机库中还有哪些其他函数可以完成此任务? 对于我的特定用例,我试图获得一个范围内的值 [1, 10]
135 c++  c++11  random  range 

4
是否可以找出lambda的参数类型和返回类型?
给定一个lambda,是否可以弄清楚它的参数类型和返回类型?如果是,怎么办? 基本上,我希望lambda_traits可以通过以下方式使用它: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long 其背后的动机是,我想lambda_traits在接受lambda作为参数的函数模板中使用,并且我需要知道函数内部的参数类型和返回类型: template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... } 就目前而言,我们可以假设lambda正好采用了一个参数。 …


4
C ++零初始化-为什么该程序中的`b`未初始化,而`a`已初始化?
根据此Stack Overflow问题的公认的(唯一的)答案, 用以下方法定义构造函数 MyTest() = default; 而是将对象初始化为零。 那为什么下面这样 #include <iostream> struct foo { foo() = default; int a; }; struct bar { bar(); int b; }; bar::bar() = default; int main() { foo a{}; bar b{}; std::cout << a.a << ' ' << b.b; } 产生以下输出: 0 32766 定义的两个构造函数都是默认值吗?对?对于POD类型,默认初始化为零初始化。 根据这个问题的公认答案, …

10
C ++ 0x没有信号量?如何同步线程?
C ++ 0x会没有信号量是真的吗?关于信号量的使用,在堆栈溢出方面已经存在一些问题。我一直使用它们(posix信号量)让一个线程在另一个线程中等待某个事件: void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... } 如果我要用互斥锁来做到这一点: void thread0(...) { doSomething0(); event1.lock(); event1.unlock(); ... } void thread1(...) { event1.lock(); doSomethingth1(); event1.unlock(); ... } 问题:这很丑陋,不能保证thread1首先锁定互斥锁(鉴于同一线程应该锁定和解锁互斥锁,因此您也不能在thread0和thread1启动之前锁定event1)。 因此,由于boost也没有信号量,实现以上目标的最简单方法是什么?

8
C ++将十六进制字符串转换为有符号整数
我想在C ++中将十六进制字符串转换为32位带符号整数。 因此,例如,我有一个十六进制字符串“ fffefffe”。其二进制表示为11111111111111101111111111111110。其带符号整数表示为:-65538。 如何在C ++中进行此转换?这也需要适用于非负数。例如,十六进制字符串“ 0000000A”(二进制为00000000000000000000000000001010),十进制为10。
135 c++  integer  hex  signed 


3
如何用lambda排序?
sort(mMyClassVector.begin(), mMyClassVector.end(), [](const MyClass & a, const MyClass & b) { return a.mProperty > b.mProperty; }); 我想使用lambda函数对自定义类进行排序,以代替绑定实例方法。但是,上面的代码会产生错误: 错误C2564:“ const char *”:将函数样式转换为内置类型只能使用一个参数 与配合使用效果很好boost::bind(&MyApp::myMethod, this, _1, _2)。
135 c++  sorting  lambda  char  const 

16
检查类是否具有给定签名的成员函数
我要一个模板技巧来检测一个类是否具有给定签名的特定成员函数。 这个问题类似于一个引用在这里 http://www.gotw.ca/gotw/071.htm ,但不一样的:在萨特的书的项目,他回答的问题是C类必须提供带成员函数特定签名,否则程序将无法编译。在我的问题中,如果一个类具有该功能,则需要执行某些操作,否则执行“其他操作”。 boost :: serialization面临着类似的问题,但我不喜欢它们采用的解决方案:模板函数默认情况下调用具有特定签名的自由函数(必须定义),除非您定义特定的成员函数(在他们的情况下,“序列化”使用两个具有给定类型的参数(带有特定签名),否则会发生编译错误。那就是要实现介入式和非介入式序列化。 我不喜欢该解决方案,原因有两个: 要成为非侵入式,您必须覆盖boost :: serialization名称空间中的全局“序列化”功能,以便您可以在客户端代码中打开名称空间boost和名称空间序列化! 解决该混乱的堆栈是10到12个函数调用。 我需要为没有该成员函数的类定义一个自定义行为,并且我的实体位于不同的名称空间中(并且我不想覆盖在一个名称空间中定义的全局函数,而在另一个名称空间中) 你能给我一个解决这个难题的提示吗?
135 c++  c++11  templates  sfinae 

9
递归函数可以内联吗?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); } 当我阅读此书时,发现上面的代码如果编译器未正确处理,将导致“无限编译”。 编译器如何决定是否内联函数?

22
C ++代码的单元测试-工具和方法论
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 4年前关闭。 改善这个问题 我正在开发一个已经开发了几年的大型c ++系统。为了提高现有代码的质量,我们参与了一个大型的长期重构项目。 您知道一个好的工具可以帮助我用C ++编写单元测试吗?也许类似于Junit或Nunit? 谁能在编写没有单元测试的模块的单元测试的方法上给出任何好的建议?

1
期货与承诺
我将自己与未来和承诺之间的差异弄混了。 显然,它们具有不同的方法和内容,但是实际用例是什么? 是吗?: 当我管理一些异步任务时,我使用future来获取“ future”的值 当我是异步任务时,我使用promise作为返回类型,以允许用户从我的promise中获得未来
134 c++  c++11  promise  future 

3
packaged_task和async有什么区别
在使用C ++ 11的线程模型时,我注意到 std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; }); auto f = task.get_future(); task(2,3); std::cout << f.get() << '\n'; 和 auto f = std::async(std::launch::async, [](int a, int b) { return a + b; }, 2, 3); std::cout << f.get() << '\n'; 似乎做的完全一样。我知道,如果std::async与一起跑步,可能会有很大的不同std::launch::deferred,但是在这种情况下,有没有区别? 这两种方法之间有什么区别,更重要的是,我应该在哪种用例中使用一种而不是另一种?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.