我希望能够在类声明中使用命名空间别名,但是会出现编译器语法错误.
struct MyClass
{
namespace abc = a_big_namespace;
void fn() {
abc::test();
}
};
Run Code Online (Sandbox Code Playgroud)
我可以让它工作的唯一方法是将别名放在每个函数中.
void fn() {
namespace abc = a_big_namespace;
abc::test();
}
Run Code Online (Sandbox Code Playgroud)
另外,我希望能够使用函数参数的别名.我没有找到解决办法.
void fn(abc::testType tt) {
abc::test(tt);
}
Run Code Online (Sandbox Code Playgroud)
有办法做我想要的吗?
编辑:我的解决方案
我发现我的特定问题并不需要未命名的命名空间,只需这样做:
namespace myspace
{
namespace abc = a_big_namespace;
struct MyClass
{
void fn(abc::testType tt) {
abc::test(tt);
}
};
}
Run Code Online (Sandbox Code Playgroud)
要切换到另一个库,这是我的别名命名空间引用的,我只需更改别名.这种方法甚至允许我在一个文件中有两次相同的类,每次都引用一个不同的库.感谢你的帮助.
如何使用Boost Filesystem复制目录?我尝试过boost :: filesystem :: copy_directory(),但只创建目标目录而不复制内容.
我在初始化列表中有很多命名空间用法,并且希望使用using命名空间来减少详细程度.但是,初始化列表超出了构造函数括号的范围,因此我必须将使用放在构造函数外部并使用它污染文件的其余部分.有没有办法根据需要调整使用范围?而不是:
MyClass::MyClass() :
m_one(nsConstants::ONE),
m_two(nsConstants::TWO),
m_three(nsConstants::THREE)
{}
Run Code Online (Sandbox Code Playgroud)
我想要:
MyClass::MyClass() :
using namespace nsConstants;
m_one(ONE),
m_two(TWO),
m_three(THREE)
{}
Run Code Online (Sandbox Code Playgroud)
_
我有一个std ::类列表,并希望删除标记为删除的条目.我正在使用std :: remove_if和erase.
class MyClass
{
bool isDone(MyData& myData)
{
return myData.isDone();
}
void removeIfDone(std::list<MyData>& myList)
{
std::list<MyData>::iterator it =
remove_if(myList.begin(), myList.end(),
boost::bind(&MyClass::isDone, this, _1));
myList.erase(it, myList.end());
}
};
Run Code Online (Sandbox Code Playgroud)
我正在一个小型处理器上运行,内存分配和释放非常昂贵.此删除在我的应用程序中调用new并删除数千次.
我以前在使用boost::ref非平凡变量作为绑定参数时使用过,但在这种情况下,我认为它可能是仿函数本身的创建和破坏,或者是造成问题的复制.
我想做点什么
boost::bind(&MyClass::isDone, boost::ref(this), boost::ref(_1));
Run Code Online (Sandbox Code Playgroud)
我找不到有关正在创建和销毁的内容的文档.所以我的简单问题是如何提高效率呢?
我正在使用Boost asio发送TCP消息.我设置了NO_DELAY选项,因为这是一个"实时"控制系统.我看到使用Wireshark在消息中设置了PSH标志.我对性能表示满意,并且按预期工作.
为了兴趣,我决定关闭NO_DELAY并测量性能差异.
我交换了现有的代码:
m_tcpSocket.open(boost::asio::ip::tcp::v4());
boost::asio::ip::tcp::no_delay noDelayOption(true);
m_tcpSocket.set_option(noDelayOption);
// snip create endpoint
m_tcpSocket.connect(m_tcpServerEndpoint);
// snip build message
m_tcpSocket.send(boost::asio::buffer(pDataBuffer, size));
Run Code Online (Sandbox Code Playgroud)
对于
boost::asio::ip::tcp::no_delay noDelayOption(false);
m_tcpSocket.set_option(noDelayOption);
Run Code Online (Sandbox Code Playgroud)
我仍然看到PSH标志设置.
我也尝试删除set_option代码并仍然看到它设置.
在Wireshark中我看到:
104 - 105 SYN
105 - 104 SYN, ACK
104 - 105 ACK
104 - 105 PSH, ACK + my message
105 - 104 ACK
Run Code Online (Sandbox Code Playgroud)
其中104和105是我的2台PC的IP地址.我对使用我的数据的消息有ACK感到惊讶.
如何关闭NO_DELAY?
我正在将一些代码从M3移植到使用3个NOP的M4,以在串行输出时钟更改之间提供非常短的延迟。M3指令集将NOP的时间定义为1个周期。我注意到M4中的NOP不一定会延迟任何时间。我知道我将需要禁用编译器优化,但是我正在寻找一个低级命令,该命令将给我可靠,可重复的时间。实际上,在这种特殊情况下,串行经常被使用,并且速度可能很慢,但是我仍然想知道获得周期级延迟的最佳方法。
c++ ×4
boost ×2
delay ×2
namespaces ×2
alias ×1
assembly ×1
boost-asio ×1
boost-bind ×1
copy ×1
cortex-m3 ×1
directory ×1
filesystems ×1
list ×1
nagle ×1
nop ×1
ref ×1
remove-if ×1
scope ×1
using ×1