返回智能指针时的最佳做法是什么,例如boost :: shared_ptr?我应该通过标准返回智能指针,还是底层的原始指针?我来自C#所以我倾向于总是返回智能指针,因为它感觉正确.像这样(跳过const-correctness更短的代码):
class X
{
public:
boost::shared_ptr<Y> getInternal() {return m_internal;}
private:
boost::shared_ptr<Y> m_internal;
}
Run Code Online (Sandbox Code Playgroud)
但是我看到一些有经验的编码器返回原始指针,并将原始指针放在向量中.做正确的方法是什么?
我在cmake中构建一个静态库,它依赖于许多其他静态库.我希望它们都包含在输出.lib/.a文件中,所以我可以将一个大的lib文件发送给客户.在VS2010中有一个选项"Link Library Dependencies"就是这样做的.
但我无法找到如何在cmake中做到这一点.你能通过cmake设置这个标志,还是以其他方式获得相同的结果?我已经尝试了target_link_libraries(...)以及add_dependencies(...)但是cmake似乎只是忽略了这一行的静态库
我注意到QWidget变得可见/不可见时没有信号/事件.还有什么我可以挂钩来获得大致相同的东西(除了轮询isVisible())?
如果显示数据的窗口小部件不可见,我想转动一些数据.
我有一个主应用程序类,其中包含一个记录器,以及一些常规应用程序配置等.
现在我将显示许多GUI窗口等(将使用记录器和配置),我不想将记录器和配置传递给每个构造函数.
我已经看到了一些变体,比如在任何地方声明主类extern,但这并不是非常面向对象的.什么是使主类中的元素可供所有(或大多数)其他类访问的"标准"C++方法?
我正在尝试使用模板特化来实现带有句柄的模板函数.
以下代码在gcc中给出了"非命名空间作用域中的显式特化":
template <typename T>
static T safeGuiCall(boost::function<T ()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
T ret = _f();
return ret;
}
}
// template specialization for functions wit no return value
template <>
static void safeGuiCall<void>(boost::function<void ()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
_f();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将它移出类(该类没有模板化)并进入命名空间,但后来我得到错误"显式专门化不能有一个存储类".我已经阅读了很多关于此的讨论,但人们似乎并不同意如何专门化功能模板.有任何想法吗?
而不是每次都做以下
start();
// some code here
stop();
Run Code Online (Sandbox Code Playgroud)
我想定义某种宏,它可以写成:
startstop()
{
//code here
}
Run Code Online (Sandbox Code Playgroud)
在C++中有可能吗?
我已经看到了关于此的其他问题,但没有一个完全解释它.编译器处理以下两种情况的正确方法是什么?我用gcc 4.7.1(使用-std = c ++ 0x),VS2010和VS2012尝试了一下,得到了不同的结果:
例1:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = b;
}
Run Code Online (Sandbox Code Playgroud)
输出:
例2:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{ …
Run Code Online (Sandbox Code Playgroud) 所以我在C++ 11之前编写了一些代码,用于根据模板参数解析字符串.我想使用可变参数模板,而不是每个参数数量都有一个定义,但我无法正确理解如何正确初始化元组.看到我想要的简化代码,这是针对2个参数的特殊情况:
template <typename Arg1, typename Arg2>
struct parser
{
static tuple<Arg1, Arg2> parse(const string& str)
{
Arg1 arg1;
Arg2 arg2;
// do the parsing with for example stringstream
return tuple<Arg1, Arg2>(arg1, arg2);
}
};
Run Code Online (Sandbox Code Playgroud)
我在将参数放在可变参数的元组中时遇到问题.我可以用以下方法构造返回值持有者:
tuple<Args...> retVal;
Run Code Online (Sandbox Code Playgroud)
但我不知道是否有办法迭代参数并将它们放入元组中.我已经看到了一些递归魔法来获得例如printf
函数,但我不知道它是否适用于这种情况.
我有以下代码:
def query(self,query):
lock = QMutexLocker(self.mutex)
reply = self.conn.query(query)
if (re.search("error", reply) != None):
raise GeneralError("Query error")
#more code...
return reply
Run Code Online (Sandbox Code Playgroud)
现在,如果抛出异常,锁似乎不会被删除,导致互斥锁未被释放.我可以在任何地方做"del lock",但这会消除qmutexlocker的全部意义.这与Python垃圾收集有关吗?如果是这样,那必然意味着QMutexLocker在Python中根本不可用?
有没有办法让 gcc 忽略无效选项,而不是死在“无法识别的选项”中?原因是我想使用一个仅在更高版本的 gcc (-static-libstdc++) 中可用的选项,但它也应该在较旧的编译器上编译。我可以在 makefile 中检查 gcc 版本,但它有点难看。