草庐IT

T_OLD_FUNCTION

全部标签

c++ - 可变参数模板、类型推导和 std::function

我正在尝试制作一个模板函数,可以将具有任何类型和数量的参数的其他函数传递给它,并将其绑定(bind)到std::function.我设法做到了这一点:#include#includeintfoo(intbar){std::coutstd::functionfunc(std::functionf){returnf;}intmain(){//autobarp=func(foo);//compilationerrorautobar=func(std::function(foo));bar(0);//prints0}我只想调用autobarp=func(foo);并推导出类型,但是这一行给出了

c++ - 从基类继承两次时如何修复 "error: no matching function for call to"

我目前正在尝试在我的项目中实现一系列继承类。因此,我使用成员初始值设定项列表并将对变量的引用“管道化”到基类。我真的不确定,为什么我会收到编译器错误。我已经尝试将引用“int&id”更改为指针“int*id”。上面的示例只是指出我的问题的最小示例:classBase{public:int&m_id;Base(int&id):m_id(id){}};classDerived1:virtualpublicBase{public:Derived1(int&id):Base(id){};};classDerived2:publicDerived1{public:Derived2(int&id)

C++11 : How can I define a function that accept a universal reference of a specific type of object?

问题:我正在用C++11开发一个程序。我想编写一个接受右值引用和左值引用的函数。(即通用引用)。以下函数接受通用引用参数:templatevoidfunction(T&&t){/*SNIP*/}但是,它接受所有类型的参数。它破坏了函数的类型安全。想让它接受特定类型的参数怎么办?这是我能想到的解决方案:voidfunction(Class&t){/*SNIP*/}voidfunction(Class&&t){function(t);}然而,它很丑陋。如果我想更改要接受的参数或更改函数名称,我必须更新函数的两个版本。有比这更好的等价物吗?编辑:问题已解决。你们都回答得很好。我对两个答案都投

c++ - 使用 lambda 作为参数:std::function 还是模板?

我正在学习c++11,对lambda特别感兴趣。经过一些实践,我假设lambda闭包是一个无名函数对象。所以我写了这段代码。templatevoidlambda_caller(callable_objectlambda){std::cout我知道我可以使用std::function而不是使用模板,但我不想在类型转换时产生开销。但是我在阅读这个问题时发现了一个问题:Whycan'tIcreateavectoroflambdainC++11?回答者说,“每个lambda都有不同的类型-即使它们具有相同的签名。”。编译器为不同的类生成不同的代码。因此,我认为每当我对要传递的lambda进行另

c++ - 使用 lambda 初始化包含 std::function 的类

我创建了一个包含std::function作为成员的模板类,方法如下:templateclassFoo{private:std::function_func;public:Foo(conststd::function&func):_func(func){}};为了不必指定传递函数的参数和返回类型,我创建了一些make_foo重载:templateautomake_foo(Ret(&func)(Args...))->Foo{return{std::function(func)};}templateautomake_foo(conststd::function&func)->Foo{ret

c++ - 为什么我收到 clang 警告 : no previous prototype for function 'diff'

我的代码中有以下声明://Centraldifffunction,makestwofunctioncalls,O(h^2)REALdiff(constREALh,constREALx,REAL(*func)(constREAL)){//diff=f(x+h)-f(x-h)/2h+O(h^2)return((*func)(x+h)-(*func)(x-h))/(2.0*h+REALSMALL);}这在“utils.h”文件中。当我使用它编译测试时,它会给我:clang++-Weverythingtests/utils.cpp-otests/utils.oInfileincludedfro

c++ - std::is_function 的实现 - 为什么我的实现表现不同?

我有以下is_function的实现:templatestruct_is_function_helper:public_false_expression{};templatestruct_is_function_helper:_true_expression{};templatestruct_is_function_helper:_true_expression{};templatestruct_is_function:public_boolean_expression::Type>::Type>::value>{};我删除引用、cv限定符,然后尝试从与_is_function_hel

c++ - Visual C++ 中的 __PRETTY_FUNCTION__

在VisualStudio2017(确切地说是15.5.6)中使用VisualC++时,我注意到GCC中的__PRETTY_FUNCTION__似乎可以工作!-至少在某种程度上……它确实在输入时出现了建议:它的值也如预期的那样显示在工具提示中:但是使用__PRETTY_FUNCTION__编译代码会导致错误:errorC2065:'__PRETTY_FUNCTION__':undeclaredidentifier那么,有什么方法可以让它在VisualC++中工作吗?有些可能包括?或者一些特殊的编译设置?(我想我使用的是默认值。)为什么它在所示示例中有效,但在实际使用中却无效?!请注意,

c++ - 有没有办法把 "inline"关键字的两种含义分开(ODR relaxation vs. function code inlining)

我想我完全理解C++中inline关键字的含义。具体来说,它意味着两个半相关的事情:对于声明为inline的函数放宽了ODR规则。因此,您可以在多个TU中定义相同的功能符号,而不会在链接它们时出现错误。这允许在header中定义函数。这是对编译器的一个建议,它应该用函数编译代码的拷贝替换函数的调用,而不是对地址的调用指令函数符号。我可以理解这两个含义在一个方向上必然相关:2必须暗示1。#2要求函数定义对所有调用该函数的TU可用。因此函数定义必须存在于多个TU中。因此需要放宽ODR以避免链接器错误。但我的问题是关于另一个方向-为什么语言设计为1必须暗示2?在某些情况下和对于某些设计决策,

c++ - 使用 std::function 作为 lambda 参数调用函数

我从这里得到的问题的基础:Failuretodeducetemplateargumentstd::functionfromlambdafunction这个线程中的问题是:为什么这段代码不能将lambda传递给函数:#include#includetemplatevoidcall(std::functionf,Tv){f(v);}intmain(intargc,charconst*argv[]){autofoo=[](inti){std::cout这个线程中的答案是,因为lambda不是std::function。但是为什么要编译这段代码:#include#includetemplate