我想做一件简单的事:
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<>
任何方式使用.
我的问题还有其他可能的解决方案吗?
是否有可能模仿这样的事情:
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++中获取指向当前函数的指针?它是如此微不足道,它应该存在.
在完美的世界中,我想找到一种获得std::function
当前函数的方法,但即使是旧式指针也可以.
澄清为什么可能需要它:我正在考虑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 - 它可能是一个捕获或其他东西.
欢迎所有合理的方案.
我想创建类似通用工厂方法的东西 - 看看这个:
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++(非)成员函数语法的指导原则,这使我能够理解(如果可能的话,没有注释)其参数和返回值的所有权策略.所有权我的意思是,所有者负责销毁拥有的对象.
我区分了以下有关参数的规则:
和关于返回值:
例如,通过引用传递对象不会占用它的所有权:
void func(object & obj) { ... }
Run Code Online (Sandbox Code Playgroud)
这些指南可能使用标准结构,如unique_ptr,shared_ptr等.如果没有这样的指导原则,那么也欢迎可能的语法误解的例子.
我有一个代码:
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
为什么在传递给i
它int
时改变它的类型lambda()
?
试图构建我自己的非GNU跨平台C++环境,我遇到的事实是我并不真正理解堆栈展开的基础知识.我构建的环境如下:
libc++
← libc++abi
← libunwind
(或一些其他退绕).
我发现libc++abi
已经包含某种libunwind,但是在Linux上没有使用它.从我理解的评论中,它是特殊的libunwind:LLVM Stack Unwinder只支持Darwin和ARM但不支持x86_64 - 而且令人困惑.CPU体系结构如何影响堆栈展开过程?
我也知道关于堆栈取消器:
我期望得到完整涵盖这个主题的答案,而不仅仅是每个问题上的单独点.
我有一个多线程程序.我想在一个线程中处理所有有意义的信号.这就是我在创建任何线程之前所做的事情:
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
)?
根据一些常识,我应该保留哪些其他信号?
我有一个结构:
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
表达式?