小编Wil*_*mKF的帖子

如何在C++中抽象出重复的try catch模式

我有一个模式,重复几个成员函数,如下所示:

int myClass::abstract_one(int sig1)
{
  try {
    return _original->abstract_one(sig1);
  } catch (std::exception& err) {
    handleException(err);
  } catch (...) {
    handleException();
  }
}

bool myClass::abstract_two(int sig2)
{
  try {
    return _original->abstract_two(sig2);
  } catch (std::exception& err) {
    handleException(err);
  } catch (...) {
    handleException();
  }
}

[...]

int myClass::abstract_n(bool sig3a, short sig3b)
{
  try {
    return _original->abstract_n(sig3a, sig3b);
  } catch (std::exception& err) {
    handleException(err);
  } catch (...) {
    handleException();
  }
}
Run Code Online (Sandbox Code Playgroud)

其中抽象一个到n是纯虚拟抽象接口用于其的方法myClass_original是具体实现.

我不喜欢这个模式在代码中重复,并希望找到一种方法来消除重复try/ catch模式和代码作为单个抽象,但我想不出一个在没有宏的情况下在C++中执行此操作的好方法.我认为有一种方法可以让模板更好地完成这项工作.

请建议一种简洁的方法来重构此代码以抽象出重复的模式.

c++ refactoring templates exception

22
推荐指数
2
解决办法
6317
查看次数

如何在Tcl中简洁地连接字符串?

我可以很容易地连接两个变量foo和bar,如下所示:"$ {foo} $ {bar}".

但是,如果我不想将中间结果放入变量中,如何轻松连接调用某些proc的结果?

这将写得很长:

set foo [myFoo $arg]
set bar [myBar $arg]
set result "${foo}${bar}"
Run Code Online (Sandbox Code Playgroud)

有没有办法在不引入临时变量foo和bar的情况下创建结果?

这样做对我的目的不正确:

concat [myFoo $arg] [myBar $arg]
Run Code Online (Sandbox Code Playgroud)

因为它在两个结果之间引入了一个空格(用于列表目的),如果不存在的话.

看起来像'string concat'就是我想要的,但它似乎不在我的Tcl解释器版本中.

string concat [myFoo $arg] [myBar $arg]
Run Code Online (Sandbox Code Playgroud)

字符串连接在这里写:

string tcl concatenation

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

使用arg捕获的异常抛出和抛出有什么区别?

想象一下两个相似的代码片段:

try {
  [...]
} catch (myErr &err) {
  err.append("More info added to error...");
  throw err;
}
Run Code Online (Sandbox Code Playgroud)

try {
  [...]
} catch (myErr &err) {
  err.append("More info added to error...");
  throw;
}
Run Code Online (Sandbox Code Playgroud)

这些是否实际相同,或者它们是否以某种微妙的方式不同?例如,第一个是否导致复制构造函数运行,而第二个可能重用相同的对象来重新抛出它?

c++ exception try-catch throw

21
推荐指数
2
解决办法
6250
查看次数

-DNDEBUG通常来自哪里?

我们的构建系统已经以某种方式发生了变化,使得优化的构建不再将-DNDEBUG添加到编译行.我搜索了我们的makefile,却找不到这个.

所以问题是,-DNDEBUG在哪里发源于大多数人以及这可能会如何改变?在我们确实有-DNDEBUG之前,我不认为这是从我们的任何makefile中删除的.

谢谢.

-威廉

c++ makefile ndebug

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

在Qt 4.4.3菜单中进行单选按钮的方法

在Linux上,希望有一组互斥的菜单项,并且当前选择的菜单项由单选按钮而不是复选框指定.

有没有办法在Qt v4.4.3中轻松完成这项工作?

qt menu radio-button

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

如何在保持使用算法的原始排序的同时从未排序的std :: vector中删除重复项?

我有一个整数数组,我需要删除重复项,同时保持每个整数第一次出现的顺序.我可以看到这样做,但想象有一种更好的方法可以更好地利用STL算法吗?插入不受我的控制,因此在插入之前我无法检查重复项.

int unsortedRemoveDuplicates(std::vector<int> &numbers) {
    std::set<int> uniqueNumbers;
    std::vector<int>::iterator allItr = numbers.begin();
    std::vector<int>::iterator unique = allItr;
    std::vector<int>::iterator endItr = numbers.end();

    for (; allItr != endItr; ++allItr) {
        const bool isUnique = uniqueNumbers.insert(*allItr).second;

        if (isUnique) {
            *unique = *allItr;
            ++unique;
        }
    }

    const int duplicates = endItr - unique;

    numbers.erase(unique, endItr);
    return duplicates;
}
Run Code Online (Sandbox Code Playgroud)

如何使用STL算法完成?

c++ duplicates stdvector stdset stl-algorithm

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

检测析构函数因抛出异常而运行的时间?

在C++中,在析构函数中检测它是否正在由于抛出异常而在堆栈展开期间运行而不是正常退出触发析构函数的范围有什么好方法?我想知道,以便我可以创建一个具有一些清理代码的类,该代码始终在正常退出时运行,但在发生异常时跳过.

c++ destructor exception raii

20
推荐指数
2
解决办法
1628
查看次数

FreeBSD v8.1上/ proc/cpuinfo的等价物是什么?

在FreeBSD v8.1上Linux的/ proc/cpuinfo相当于什么?我的应用程序读取/ proc/cpuinfo并将信息保存在日志文件中,我该怎么做才能在FreeBSD上记录类似的信息?

示例/ proc/cpuinfo如下所示:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 23
model name  : Intel(R) Xeon(R) CPU           E5420  @ 2.50GHz
stepping    : 8
cpu MHz     : 2499.015
cache size  : 6144 KB
fdiv_bug    : no
hlt_bug     : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 10
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge …
Run Code Online (Sandbox Code Playgroud)

linux cpu porting freebsd introspection

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

当一个线程forks()时,其他线程会发生什么?

在使用pthreads的C++中,如果你的一个线程调用fork,你的其他线程会发生什么?

似乎线程不遵循.在我的情况下,我正在尝试创建一个守护进程,我使用fork()与父进程deamonize它.但是,在通过代码的新路径中,我在fork之前创建了一些线程,之后又创建了一些线程.是否有一种简单的方法可以将线程的所有权更改为新的分叉进程,而不是在fork之后移动我的所有线程创建?

c++ multithreading fork pthreads

19
推荐指数
3
解决办法
8960
查看次数

如何在Emacs中逐步搜索全小写模式?

在Emacs中,默认情况下,增量搜索不区分大小写.但是,如果您键入任何大写字符作为搜索字符串的一部分,它将成为区分大小写的搜索.所以问题是,如何轻松执行全小写模式的区分大小写搜索.字符越少,记忆越好越好.我很确定这是内置的,只是不记得如何做到这一点.

emacs incremental-search case-sensitive

18
推荐指数
2
解决办法
3027
查看次数