小编aby*_*s.7的帖子

如何在C++中使用lambda作为模板参数和默认值?

我想做一件简单的事:

void DoUntil(auto predicate = [] { return false; });
Run Code Online (Sandbox Code Playgroud)

显然这不起作用 - 我必须使用模板参数:

template <typename P>
void DoUntil(P predicate = [] { return false; });
Run Code Online (Sandbox Code Playgroud)

但是这个陈述也不起作用 - Clang给出了一个错误:

错误:没有匹配函数用于调用...
注意:候选模板被忽略:无法推断模板参数'P'

如果我没有参数调用函数,编译器无法从默认参数中推断出类型:

int main() { DoUntil(); }
Run Code Online (Sandbox Code Playgroud)

我不想以std::function<>任何方式使用.

我的问题还有其他可能的解决方案吗?

c++ lambda c++17

10
推荐指数
2
解决办法
1256
查看次数

如何声明两个函数将彼此的签名作为参数?

是否有可能模仿这样的事情:

typedef boost::function<void(A)> B;
typedef boost::function<void(B)> A;
Run Code Online (Sandbox Code Playgroud)

主要目标是能够编写这样的代码(在伪c ++中):

void a_(B b) {
  // ...
  b(a_);
}
void b_(A a) {
  // ...
  f(boost::bind(a, b_));
}

f(boost::bind(a_, b_));
Run Code Online (Sandbox Code Playgroud)

c++ boost argument-passing function-signature

9
推荐指数
1
解决办法
241
查看次数

是否存在对象的"this"的类比,但对于函数?

我已经搜索了引用和一般网络,但我无法找到,如果它存在.

有没有办法在C++中获取指向当前函数的指针?它是如此微不足道,它应该存在.

在完美的世界中,我想找到一种获得std::function当前函数的方法,但即使是旧式指针也可以.

澄清为什么可能需要它:我正在考虑Lambda函数内部的递归,甚至是函数中的一般递归,在将来的版本中,名称更改的可能性很大.

c++ function-pointers this

9
推荐指数
2
解决办法
576
查看次数

如何让lambda成为一个班级的朋友?

比方说,我有一节课:

class A {
  int a;
};
Run Code Online (Sandbox Code Playgroud)

我有一个lambda:

auto function = [](A* a) {
  a->a;  // <== gives an error in this line.
};

function(new A);
Run Code Online (Sandbox Code Playgroud)

有没有办法在lambda中使用私有成员/方法? - 没有必要将指针传递给lambda - 它可能是一个捕获或其他东西.

欢迎所有合理的方案.

c++ lambda friend c++11

9
推荐指数
2
解决办法
3567
查看次数

通用工厂方法和可变参数模板的问题

我想创建类似通用工厂方法的东西 - 看看这个:

template <class BaseType>
class Factory {
  public:
    template <class ... Args>
    static BaseType* Create(const Args& ... args) {
      return new DerivedType(args ...);
    }
};
Run Code Online (Sandbox Code Playgroud)

其中的DerivedType某些其他类型来自BaseType不同的地方并在其他地方定义.

问题在于存储DerivedType.我想这样做,例如,像这样:

void f() {
  // Derived type may have more than one constructor,
  // that's why I suggest using of the variadic templates.
  BaseType* ptr1 = Factory<BaseType>::Create("abc", 5, 10.);
  BaseType* ptr2 = Factory<BaseType>::Create();
  ...
}

...

Factory<BaseType>::SetType<MyDerivedType>();
f();

Factory<BaseType>::SetType<YourDerivedType>();
f();
Run Code Online (Sandbox Code Playgroud)

我可以设置不同的派生类型,但所有这些类型在编译时都是已知的.我想不出适当的技术来做到这一点.

问题:你能告诉一个吗?


这样做的理由(因此,原始问题,如果有人建议问题是它自己的XY问题) - 是一种单元测试一些棘手的代码部分的能力.例如,如果我有一个代码: …

c++ unit-testing factory-pattern variadic-templates c++11

8
推荐指数
1
解决办法
962
查看次数

在C++中获取所有权和释放对象的语法准则

我想知道 - 有没有关于C++(非)成员函数语法的指导原则,这使我能够理解(如果可能的话,没有注释)其参数和返回值的所有权策略.所有权我的意思是,所有者负责销毁拥有的对象.

我区分了以下有关参数的规则:

  • 取得所有权
  • 不要拥有所有权
  • 分享

和关于返回值:

  • 发布('按值返回'在此组中)
  • 不释放
  • 分享

例如,通过引用传递对象不会占用它的所有权:

void func(object & obj) { ... }
Run Code Online (Sandbox Code Playgroud)

这些指南可能使用标准结构,如unique_ptr,shared_ptr等.如果没有这样的指导原则,那么也欢迎可能的语法误解的例子.

c++ ownership

7
推荐指数
2
解决办法
2363
查看次数

为什么我不能将rvalue-reference传递给C++ 11中的另一个函数?

我有一个代码:

void f(int&& i) {
  auto lambda = [](int&& j) { (void)j; }
  lambda(i);
}

int main() {
  f(5);
}
Run Code Online (Sandbox Code Playgroud)

Clang ++给出了一个错误: no known conversion from 'int' to 'int &&' for 1st argument

为什么在传递给iint时改变它的类型lambda()

c++ rvalue-reference c++11 pass-by-rvalue-reference

7
推荐指数
2
解决办法
1731
查看次数

什么样的堆栈展开库确实存在,有什么区别?

试图构建我自己的非GNU跨平台C++环境,我遇到的事实是我并不真正理解堆栈展开的基础知识.我构建的环境如下:

libc++libc++abilibunwind(或一些其他退绕).

我发现libc++abi已经包含某种libunwind,但是在Linux上没有使用它.从我理解的评论中,它是特殊的libunwind:LLVM Stack Unwinder只支持Darwin和ARM但不支持x86_64 - 而且令人困惑.CPU体系结构如何影响堆栈展开过程?

我也知道关于堆栈取消器:

  1. glibc内置.
  2. libc ++ abi LLVM libunwind.
  3. GNU libunwind(来自稀树草原).

问题:

  1. 平台或CPU架构如何影响堆栈展开过程?
  2. 为什么要有多个堆叠退绕器 - 而不仅仅是一个?
  3. 什么样的unwinders确实存在,它们之间有什么区别?

答案的期望:

我期望得到完整涵盖这个主题的答案,而不仅仅是每个问题上的单独点.

c++ linux cpu-architecture llvm stack-unwinding

7
推荐指数
1
解决办法
1330
查看次数

在C中的多线程程序中,线程不应该阻塞哪些信号?

我有一个多线程程序.我想在一个线程中处理所有有意义的信号.这就是我在创建任何线程之前所做的事情:

sigset_t signal_set, old_set;

sigfillset(&signal_set);
// What signals should I leave unblocked here?
pthread_sigmask(SIG_SETMASK, &signal_set, &old_set);

std::thread( /* some args */ );

pthread_sigmask(SIG_SETMASK, &old_set, nullptr);
Run Code Online (Sandbox Code Playgroud)

但我的理智建议保留一些信号畅通无阻,因为有很多情况可以将信号直接发送到特定线程:SIGSEGV或者SIGPROF- 我相信,它与SIGINT在交互式程序中保持畅通无阻一样好.


我的建议是否正确这两个信号(SIGSEGV,SIGPROF)?

根据一些常识,我应该保留哪些其他信号?

c multithreading signals

7
推荐指数
1
解决办法
84
查看次数

如何在C++中获取重载方法的返回类型?

我有一个结构:

struct A {
  ComplicatedType1 f();
  ComplicatedType2 f(int);
};
Run Code Online (Sandbox Code Playgroud)

我想获得f()使用编译时助手的返回类型.我正在努力std::result_of<>:

using Type = std::result_of<decltype(&A::f)()>::type;
Run Code Online (Sandbox Code Playgroud)

但是编译器给了我一个合理的错误:"无法解决对重载函数的引用".

所以我去了SO,并看到了这个被接受和赞成的答案,这建议做出一个static_cast<ComplicatedType1 (A::*)()>(&A::f)- 但我现在没有ComplicatedType1.我陷入了递归之中.


如何用最少的代码ComplicatedType1进入我的using表达式?

c++ overloading syntactic-sugar c++11

7
推荐指数
1
解决办法
274
查看次数