我正在使用clang尝试解析(使用C++ API)一些C++文件并使所有case-break对使用特定的样式.
示例:
**Original**
switch(...)
{
case 1:
{
<code>
}break;
case 2:
{
<code>
break;
}
}
**After replacement**
switch(...)
{
case 1:
{
<code>
break;
}
case 2:
{
<code>
break;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,如果代码部分不包含任何宏,我到底做了什么.我的问题是:clang处理扩展(如果我转换一个有问题的语句,它将显示扩展版本)宏是否有所不同?如果是这样我怎么能让它工作?
可能有用的其他信息:
我正在使用Rewriter :: ReplaceStmt用新创建的CompoundStmt替换每个案例的子语句,我注意到如果"from"参数包含一个宏,则replaceStmt返回true,并且该方法返回true的唯一方法是if
Rewriter :: getRangeSize(from-> getSourceRange())
返回-1
我最近遇到了这段代码
T operator () () &
{
...
}
T operator () () &&
{
...
}
Run Code Online (Sandbox Code Playgroud)
而且我很困惑.&和&&在这种情况下意味着什么?这类似于复制和移动构造函数,但是对于函数?
我有以下代码似乎在GDB中表现奇怪,具体取决于复制/移动构造函数是否默认.
#include <iostream>
#define CUSTOM 0
class Percentage
{
public:
using value_t = double;
Percentage() = default;
~Percentage() = default;
template <typename T>
Percentage(T) = delete;
Percentage(value_t value):
m_value(value)
{}
#if CUSTOM == 1
Percentage(const Percentage& p):
m_value(p.m_value)
{}
Percentage& operator=(const Percentage& p)
{
m_value = p.m_value;
return *this;
}
Percentage(Percentage&& p):
m_value(std::move(p.m_value))
{}
Percentage& operator=(Percentage&& p)
{
m_value = std::move(p.m_value);
return *this;
}
#else
Percentage(const Percentage&) = default;
Percentage& operator=(const Percentage&) = default;
Percentage(Percentage&&) = default;
Percentage& operator=(Percentage&&) = …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照如何使用VS调试Linux应用程序的这些步骤.
我遇到的问题是在步骤8,它由VS无法找到命令"Debug.GDBLaunch"组成.
我正在运行VS版本14.0.23107.0 D14REL,我安装了Visual C++ Cross Platform Mobile Development 1.0.
我有什么其他要求,如果没有,问题是什么?
浏览一些互联网板我遇到了这个小挑战:
"用您喜欢的语言实现递归匿名函数"
显然,使用std :: function/function指针很容易.
我真正感兴趣的是,如果没有将lambda绑定到标识符,这是否可行?
像(忽略明显的无限递归)的东西:
[](){ this(); }();
Run Code Online (Sandbox Code Playgroud) 任何人都可以向我解释为什么我必须在第二个lambda中明确写出"this->",即使我捕获了一切?
完整性的错误消息:
无法在没有对象的情况下调用成员函数'result_t test :: get()'
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
using result_t = std::function<void()>;
struct test
{
bool noMore = false;
result_t get()
{
return [this]
{
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
if(not noMore)
{
noMore = true;
std::for_each(vec.begin(), vec.end(),
[&](const auto& i)
{
auto value1 = this->get(); // compiles
auto value2 = get(); // error
});
}
};
}
};
int main() {
test t;
t.get()();
}
Run Code Online (Sandbox Code Playgroud)
观看Herb Sutter关于C++及其他原子的讨论我瞥见了他的一个易于使用的锁定/解锁机制的想法,该机制可能会或可能不会出现在该语言的未来标准中.
该机制看起来像:
atomic{
// code here
}
Run Code Online (Sandbox Code Playgroud)
我不想等待未来的标准我自己试图实现这个,我想出的是:
#define CONCAT_IMPL(A, B) A ## B
#define CONCAT(A, B) CONCAT_IMPL(A, B)
# define atomic(a) { \
static_assert(std::is_same<decltype(a), std::mutex>::value,"Argument must be of type std::mutex !");\
struct CONCAT(atomic_impl_, __LINE__)\
{\
std::function<void()> func;\
std::mutex* impl;\
CONCAT(atomic_impl_, __LINE__)(std::mutex& b)\
{ \
impl = &b;\
impl->lock();\
}\
CONCAT(~atomic_impl_, __LINE__)()\
{ \
func();\
impl->unlock(); \
}\
} CONCAT(atomic_impl_var_, __LINE__)(a);\
CONCAT(atomic_impl_var_, __LINE__).func = [&]()
Run Code Online (Sandbox Code Playgroud)
和用法:
std::mutex mut;
atomic(mut){
// code here
};}
Run Code Online (Sandbox Code Playgroud)
问题显然是}; 我想删除.
这有可能吗?
我正在使用这段代码尝试从QTextEdit中删除最后一行:
ui->textEdit_2->textCursor().setPosition( QTextCursor::End);
auto k = ui->textEdit_2->textCursor().currentTable();
k->removeRows(k->rows() - 1, 1);
Run Code Online (Sandbox Code Playgroud)
但是我遇到了分段错误.调试后,我发现当调用removeRows时,k为null.
难道我做错了什么?如果是的话,怎么解决?
我正在使用DirectWrite将一些文本呈现到窗口.除了使用不同字体大小的定位外,一切似乎都有效:我希望有两个字体大小为v1和v2的文本以及两个带有(x,y)=(0,0)的文本位于左上角,但正如您所见:

"测试"和"X"都不在左上方.
有没有办法让这项工作?
为什么我们不能在函数上使用explicit关键字?我想不出有一个很好的理由不允许这个(和几个相反).
为什么是这样?