我有一个名为 的类MutexLock,它听起来像:它在构造时锁定互斥锁,并在销毁时释放它:
class OpenEXRMutexLock
{
#ifndef HAVE_PTHREADS
public:
OpenEXRMutexLock() : lock(openEXRmutex) { }
private:
std::unique_lock<std::mutex> lock;
#endif
};
Run Code Online (Sandbox Code Playgroud)
当定义了 HAVE_PTHREADS 时,gcc 4.9.1 每次我都会抱怨未使用的变量:
OpenEXRMutexLock lock;
Run Code Online (Sandbox Code Playgroud)
当然,这个类永远不会在构造和自动销毁之外使用。
目前,我做了一些丑陋的事情:我补充说
void OpenEXRMutexLock::dummyFuncAvoidingWarnings() const {}
Run Code Online (Sandbox Code Playgroud)
并随处调用它:
OpenEXRMutexLock lock;
lock.dummyFuncAvoidingWarnings(); //Eeerk
Run Code Online (Sandbox Code Playgroud)
有没有办法在不禁用整个项目中未使用的变量警告的情况下避免这种情况?
我有以下功能:
void raiseError(const char *msg, ...)
{
va_list ap;
va_start(ap, msg); // use variable arg list
int size = vsnprintf(nullptr, 0, msg, ap);
std::vector<char> s(size+1, 0);
vsnprintf(s.data(), size, msg, ap);
va_end(ap);
errorString = std::string(s.data()));
}
Run Code Online (Sandbox Code Playgroud)
我打电话的时候
raiseError("File not found in <%s> : <%s>", "a", "b" );
Run Code Online (Sandbox Code Playgroud)
第一个vsnprintf调用(计算最终字符串大小)返回正确的值27.但最后一个字符串是:
"<**A*>中找不到文件:"
程序启动时'*'字符是随机的.
此外,该程序在MinGW中工作,问题只出现在linux gcc上.
我的代码有什么问题?
我在很多 SO 答案中都看到过这种代码:
template <typename T>
inline T imax (T a, T b)
{
return (a > b) * a + (a <= b) * b;
}
Run Code Online (Sandbox Code Playgroud)
哪里有作者说这个无分支。
但这在当前架构上真的是无分支的吗?(x86, ARM...) 是否有真正的标准保证这是无分支的?
我正在编写一个容器类,并希望提供一个构造函数,将迭代器作为参数,但前提是底层迭代类型与容器类型匹配.
所以我写道:
template<typename T>
class Buffer
{
public:
template <typename InputIter>
typename std::enable_if<std::is_same<typename std::iterator_traits<InputIter>::value_type, typename T>>::type
Buffer(InputIter first, InputIter last)
{
}
};
Run Code Online (Sandbox Code Playgroud)
但我有编译错误说模板参数1和2无效
怎么了?
代码与编译器:https://onlinegdb.com/SyIqN_mBG
我正在交换一个struct update_packet与其他服务器(相同或类似系统)调用的结构,通过UDPsocket使用sendto(..)和运行相同的程序recvfrom().
update_packet 需要采用通用消息格式,这意味着其字段具有预定的固定大小,结构的大小是字段的总和.
struct node {
uint32_t IP;
uint16_t port;
int16_t nil;
uint16_t server_id;
uint16_t cost;
};
struct update_packet {
uint16_t num_update_fields;
uint16_t port;
uint32_t IP;
struct node * nodes;
update_packet() :
num_update_fields(num_nodes), IP(myIP), port(myport)
{//fill in nodes array};
};
Run Code Online (Sandbox Code Playgroud)
(update_packet包含一个指针数组struct node)
我以前用UDP reinterpret_cast发送一个实例update packet,然后编译并发送到正确的目的地.
int update_packet_size = sizeof(up);
sendto(s, reinterpret_cast<const char*>(&up), update_packet_size, 0,
(struct sockaddr *)&dest_addr, sizeof(dest_addr));
Run Code Online (Sandbox Code Playgroud)
但是,当我收到它并尝试解码它
struct update_packet update_msg =
reinterpret_cast<struct …Run Code Online (Sandbox Code Playgroud) 我试图QMutex在我的应用程序(蒙特卡罗模拟)中替换std::mutex,并且令人惊讶的是,计算速度除以3.互斥锁定/解锁性能成本从可忽略不计到线程时间的约66%.
我深入研究了实现源代码.我最初认为两者都是Win32线程的包装器(有一个额外的pthread层std::thread),但实际上Qt没有使用任何内核函数用于互斥锁,并且有自己的基于原子变量的内部实现.这个似乎要快得多.
谢谢
c ++接受:
if(int a=1)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
出于学习目的,我编写了一个简单的锁机制类:
class SimpleLock
{
public:
class Token
{
public:
friend class SimpleLock;
Token(SimpleLock & lock) : lock(lock), locked(!lock.locked.exchange(true)) { }
~Token() { if(locked) lock.locked.store(false); }
operator bool() const { return locked; }
private:
SimpleLock & lock;
const bool locked;
};
SimpleLock() : locked(false) { }
private:
std::atomic_bool locked;
};
Run Code Online (Sandbox Code Playgroud)
允许我这样做:
SimpleLock::Token t(lock);
if(t) //Token has an operator bool() overload
{
//...
}
Run Code Online (Sandbox Code Playgroud)
以下为什么不编译?
if(SimpleLock::Token t(lock))
{
//...
}
Run Code Online (Sandbox Code Playgroud)
编译错误:
在't'之前预期的初级表达
在线代码链接:http: …
boost::asio::io_context::run()当没有待处理的工作时确实返回。我想避免这种行为,以便run()无限期地等待新作品,并有可能从另一个线程中停止它。
我想这可以通过在 中启动一个无限长的计时器io_context,并cancel()在需要时调用该计时器来完成run()返回来完成。
这是一种正确的方法吗,有没有一种干净的方法来做到这一点?
我有下面的c ++ 11代码,可以正常工作,而我希望它会崩溃甚至无法编译。检索指向纯虚拟成员函数的指针应返回null或无效的指针,或者应被编译器阻止。我想了解它为什么起作用。
我知道还有其他(更好)的方式对此进行编码,这是理解语法的纯理论性问题。
#include <iostream>
#include <functional>
class Abstract
{
public:
void foo()
{
auto func = std::bind(&Abstract::virtualFoo, this);
func();
}
protected:
virtual void virtualFoo() = 0;
};
class Derived1 : public Abstract
{
private:
void virtualFoo() override
{
std::cout << "I am Derived1\n";
}
};
class Derived2 : public Abstract
{
private:
void virtualFoo() override
{
std::cout << "I am Derived2\n";
}
};
int main(int argc, char *argv[])
{
Abstract * a1 = new Derived1;
Abstract * a2 …Run Code Online (Sandbox Code Playgroud) 我有一个带有std::function参数的模板函数,模板参数定义函数签名:
template<typename... Args>
void addController(const char * name, const std::function<bool(Args...)> & func);
Run Code Online (Sandbox Code Playgroud)
它可以传递一个std::function变量:
std::function<bool()> foo_func = [this]()->bool {return this->isFoo(); };
addController<>("foo", foo_func); //Works
Run Code Online (Sandbox Code Playgroud)
但如果我直接传递 lambda,则无法推导出类型:
//Fails to compile
addController<>("foo", [this]()->bool {return this->isFoo(); });
Run Code Online (Sandbox Code Playgroud)
使用非模板函数可以:
void addControllerNoArg(const char * name, std::function<bool()> func);
addControllerNoArg("foo", [this]() {return this->isFoo(); }); //Works
Run Code Online (Sandbox Code Playgroud)
我需要 <typename... Args> 模板来将变体向量参数表展开到函数调用中。这实际上在实现中确实有效,唯一的问题是我无法直接将 lambda 传递给 addController 。
最小示例: https: //onlinegdb.com/MS1cEreKhk