小编ere*_*eOn的帖子

如何移动屏幕而不在Vim中移动光标?

我最近发现了Vim的Ctrl+ ECtrl+ Y快捷键,分别用一行步骤上下移动屏幕,而不移动光标.

你知道任何将光标留在原处的命令,但是移动屏幕使得有光标的线成为第一行吗?(拥有最后一行的命令将是一个很好的奖励).

我可以通过手动按Ctrl+ E(或Ctrl+ Y)适当的次数来实现这一点,但是有一个命令以某种方式直接这样做会很好.

有任何想法吗?

vim scroll cursor-position

565
推荐指数
11
解决办法
12万
查看次数

如何使我的自定义类型与"基于范围的for循环"一起使用?

像许多人一样,我一直在尝试C + 11带来的不同功能.我最喜欢的一个是"基于范围的循环".

我明白那个:

for(Type& v : a) { ... }
Run Code Online (Sandbox Code Playgroud)

相当于:

for(auto iv = begin(a); iv != end(a); ++iv)
{
  Type& v = *iv;
  ...
}
Run Code Online (Sandbox Code Playgroud)

而这begin()只是返回a.begin()标准容器.

但是,如果我想让我的自定义类型"基于范围的循环" - 意识到什么?

如果我只是专注begin()end()

如果我的自定义类型属于命名空间xml,我应该定义xml::begin()还是std::begin()

简而言之,这样做的准则是什么?

c++ customization for-loop c++11

230
推荐指数
5
解决办法
7万
查看次数

如何正确实现自定义迭代器和const_iterators?

我有一个自定义容器类,我想写它iteratorconst_iterator类.

我之前从未这样做过,但我找不到合适的方法.关于迭代器创建的指导原则是什么,我应该注意什么?

我也想避免代码重复(我觉得const_iteratoriterator分享很多东西;应该是另一个子类吗?).

脚注:我很确定Boost有什么可以缓解的,但我不能在这里使用它,因为很多愚蠢的原因.

c++ iterator const-iterator

217
推荐指数
8
解决办法
17万
查看次数

Qt是否支持虚拟纯插槽?

我的GUI项目Qt有很多"配置页面"类,它们都直接从中继承QWidget.

最近,我意识到所有这些类共享2个公共插槽(loadSettings()saveSettings()).

对此,我有两个问题:

  • BaseConfigurationPage用这两个插槽作为虚拟纯方法编写一个中间基本抽象类(让它命名)是否有意义?(每个可能的配置页面总是有这两种方法,所以我会说"是")
  • 在我对代码进行大量更改之前(如果必须):Qt是否支持虚拟纯插槽?有什么我应该知道的吗?

这是一个描述所有内容的代码示例:

class BaseConfigurationPage : public QWidget
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    virtual void loadSettings() = 0;
    virtual void saveSettings() = 0;
};

class GeneralConfigurationPage : public BaseConfigurationPage
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    void loadSettings();
    void saveSettings();
};
Run Code Online (Sandbox Code Playgroud)

c++ inheritance qt signals-slots

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

什么是std :: string :: c_str()生命周期?

在我的一个程序中,我必须与一些可用的遗留代码进行交互const char*.

可以说我的结构看起来像:

struct Foo
{
  const char* server;
  const char* name;
};
Run Code Online (Sandbox Code Playgroud)

我的高级应用程序只处理std::string,所以我想用std::string::c_str()回来const char*指针.

但是它的寿命是c_str()多少?

我可以做这样的事情而不面对未定义的行为吗?

{
  std::string server = "my_server";
  std::string name = "my_name";

  Foo foo;
  foo.server = server.c_str();
  foo.name = name.c_str();

  // We use foo
  use_foo(foo);

  // Foo is about to be destroyed, before name and server
}
Run Code Online (Sandbox Code Playgroud)

或者我应该立即将结果复制c_str()到另一个地方?

谢谢.

c++ string cstring

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

如何在Python中替换(或剥离)文件名中的扩展名?

Python中是否有内置函数可以替换(或删除)文件扩展名(如果有的话)?

例:

print replace_extension('/home/user/somefile.txt', '.jpg')
Run Code Online (Sandbox Code Playgroud)

在我的例子中:/home/user/somefile.txt将成为/home/user/somefile.jpg

我不知道它是否重要,但我需要这个我正在编写的SCons模块.(所以也许我可以使用一些SCons特定的功能?)

我想要干净的东西.对字符串中的所有实例进行简单的字符串替换.txt显然不是很干净.(如果我的文件名是这会失败somefile.txt.txt.txt)

python scons

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

编译器优化会引入错误吗?

今天我和我的一个朋友进行了讨论,我们就"编译器优化"进行了几个小时的讨论.

我辩护说,有时,编译器优化可能会引入错误或至少是不良行为.

我的朋友完全不同意,他说"编译器是由聪明人构建并做聪明的东西",因此永远不会出错.

他根本没有说服我,但我不得不承认我缺乏现实生活中的例子来强化我的观点.

谁在这?如果是的话,您是否有任何现实生活中的例子,编译器优化会在生成的软件中产生错误?如果我错了,我应该停止编程并学习钓鱼吗?

compiler-construction optimization compiler-optimization

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

在C++中是否有64位整数的"标准"类似htonl的函数?

我正在研究memcache协议的实现,在某些点上,它使用64位整数值.这些值必须以"网络字节顺序"存储.

我希望有一些uint64_t htonll(uint64_t value)功能可以进行更改,但不幸的是,如果它存在,我找不到它.

所以我有1或2个问题:

  • 是否有任何可移植(Windows,Linux,AIX)标准功能?
  • 如果没有这样的功能,你会如何实现它?

我想到了一个基本的实现,但我不知道如何在编译时检查字节序以使代码可移植.所以你的帮助非常受欢迎;)

谢谢.


这是我写的最终解决方案,感谢Brian的解决方案.

uint64_t htonll(uint64_t value)
{
    // The answer is 42
    static const int num = 42;

    // Check the endianness
    if (*reinterpret_cast<const char*>(&num) == num)
    {
        const uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32));
        const uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFLL));

        return (static_cast<uint64_t>(low_part) << 32) | high_part;
    } else
    {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ 64-bit portability endianness htonl

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

什么是单一的"抛出"; 声明呢?

这些天,我一直在阅读很多C++ FAQ,尤其是这个页面.

通过阅读本节,我发现了一种"技术",作者称之为"异常调度程序",允许某人将所有异常处理分组到一个方便的函数中:

void handleException()
{
  try {
    throw; // ?!
  }
  catch (MyException& e) {
    //...code to handle MyException...
  }
  catch (YourException& e) {
    //...code to handle YourException...
  }
}

void f()
{
  try {
    //...something that might throw...
  }
  catch (...) {
    handleException();
  }
}
Run Code Online (Sandbox Code Playgroud)

困扰我的是单一throw;陈述:如果你考虑给定的例子然后肯定,它显然是做什么的:它重新抛出首先陷入的异常f()并再次处理它.

但是,如果我handleException()直接调用它,而不是从一个catch()条款中做到这一点怎么办?有没有指定的行为?

此外,对于奖励积分,throw你知道的还有其他"怪异"(可能不是好词)的使用吗?

谢谢.

c++ exception throw

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

如何确保编译器优化不会带来安全风险?

我必须编写一个Windows服务,在某些时候处理机密数据(如PIN码,密码等).这些信息需要很短的时间:通常它们几乎立即被发送到智能卡读卡器.

让我们考虑这段代码:

{
  std::string password = getPassword(); // Get the password from the user

  writePasswordToSmartCard(password);

  // Okay, here we don't need password anymore.
  // We set it all to '\0' so it doesn't stay in memory.
  std::fill(password.begin(), password.end(), '\0');
}
Run Code Online (Sandbox Code Playgroud)

现在我关心的是编译器优化.在这里,编译器可能会检测到密码即将被删除,并且此时更改其值是无用的,只需删除该调用即可.

我不希望我的编译器关心未来未引用的内存的价值.

我的担忧是否合法?我怎么能确定这样的代码不会被优化?

c++ memory compiler-construction security optimization

39
推荐指数
3
解决办法
2495
查看次数