小编Rol*_*lle的帖子

返回智能指针时的最佳做法

返回智能指针时的最佳做法是什么,例如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)

但是我看到一些有经验的编码器返回原始指针,并将原始指针放在向量中.做正确的方法是什么?

c++ boost smart-pointers

31
推荐指数
4
解决办法
2万
查看次数

cmake:在静态库中包含库依赖项

我在cmake中构建一个静态库,它依赖于许多其他静态库.我希望它们都包含在输出.lib/.a文件中,所以我可以将一个大的lib文件发送给客户.在VS2010中有一个选项"Link Library Dependencies"就是这样做的.

但我无法找到如何在cmake中做到这一点.你能通过cmake设置这个标志,还是以其他方式获得相同的结果?我已经尝试了target_link_libraries(...)以及add_dependencies(...)但是cmake似乎只是忽略了这一行的静态库

c++ cmake

27
推荐指数
2
解决办法
2万
查看次数

pyqt:当小部件变为可见/隐藏时接收信号

我注意到QWidget变得可见/不可见时没有信号/事件.还有什么我可以挂钩来获得大致相同的东西(除了轮询isVisible())?

如果显示数据的窗口小部件不可见,我想转动一些数据.

qt signals pyqt

13
推荐指数
1
解决办法
1万
查看次数

做全局变量的正确"C++方式"是什么?

我有一个主应用程序类,其中包含一个记录器,以及一些常规应用程序配置等.

现在我将显示许多GUI窗口等(将使用记录器和配置),我不想将记录器和配置传递给每个构造函数.

我已经看到了一些变体,比如在任何地方声明主类extern,但这并不是非常面向对象的.什么是使主类中的元素可供所有(或大多数)其他类访问的"标准"C++方法?

c++ oop design-patterns

12
推荐指数
3
解决办法
4302
查看次数

静态成员函数的模板特化; 如何?

我正在尝试使用模板特化来实现带有句柄的模板函数.

以下代码在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)

我已经尝试将它移出类(该类没有模板化)并进入命名空间,但后来我得到错误"显式专门化不能有一个存储类".我已经阅读了很多关于此的讨论,但人们似乎并不同意如何专门化功能模板.有任何想法吗?

c++ templates boost

9
推荐指数
2
解决办法
2万
查看次数

c ++ #define带括号的宏?

而不是每次都做以下

start();

// some code here

stop();
Run Code Online (Sandbox Code Playgroud)

我想定义某种宏,它可以写成:

startstop()
{

//code here

}
Run Code Online (Sandbox Code Playgroud)

在C++中有可能吗?

c++ macros

8
推荐指数
3
解决办法
4291
查看次数

转换运算符重载歧义,编译器不同

我已经看到了关于此的其他问题,但没有一个完全解释它.编译器处理以下两种情况的正确方法是什么?我用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)

输出:

  • gcc 4.7.1:好的
  • VS2010:好的
  • VS2012:失败:"无法从BB转换为字符串"

例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++ gcc operators visual-studio

8
推荐指数
1
解决办法
2434
查看次数

使用可变参数模板构建元组

所以我在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函数,但我不知道它是否适用于这种情况.

c++ templates c++11

6
推荐指数
1
解决办法
8281
查看次数

PyQt:QMutexLocker未在异常时发布

我有以下代码:

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中根本不可用?

python pyqt

5
推荐指数
2
解决办法
1277
查看次数

gcc:忽略无法识别的选项

有没有办法让 gcc 忽略无效选项,而不是死在“无法识别的选项”中?原因是我想使用一个仅在更高版本的 gcc (-static-libstdc++) 中可用的选项,但它也应该在较旧的编译器上编译。我可以在 makefile 中检查 gcc 版本,但它有点难看。

gcc makefile

5
推荐指数
1
解决办法
1688
查看次数