小编Ral*_*zky的帖子

如何在D接口中有意义地使用前提条件契约?

当我使用"in"合约覆盖D中的函数时,将检查继承的"in"合约.如果它们失败,则检查被覆盖的"in"合同.如果我没有在合同中指定任何合同,那么它被解释为好像有一个空的"in"合同.因此,以下代码编译并成功运行.

module main;
import std.stdio;

interface I
{
    void write( int i )
    in
    {
        assert( i > 0 );
    }
}

class C : I
{
    void write( int i )
    {
        writeln( i );
    }
}

int main()
{
    I i = new C;

    i.write( -5 );
    getchar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只想在I.write()调用时检查前提条件,i.write()因为这是静态已知的足以I.write()使编译器正确运行的内容.动态调度之后检查所有前提条件从OO角度来看是奇怪的,因为封装丢失了.

我可以重复前提条件或写入in { assert( false ); }实现接口的所有类,但这很痛苦.这是D语言中的设计错误吗?或者有没有适当的可扩展方式来做到这一点?

contracts d interface

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

如何在未知代码中调试异常?

我有一个使用外部库的程序.其中一个库(负责相机硬件)启动一个线程并且无法预测崩溃.有时每2分钟,有时不会持续一个小时.没有明显的触发因素.线程没有捕获异常,导致应用程序终止.:(

幸运的是,我可以在RaiseException()函数引发异常时停止应用程序kernel32.dll.调用堆栈上没有其他函数,我知道它们的用途.

调试器告诉我,这是一个std :: bad_alloc异常.调试器如何知道?我可以以某种方式获得有关异常的更多信息吗?如果有必要,我会查看反汇编,但我不知道从哪里获取信息.

我正在使用Visual Studio C++ 2010,熟悉汇编程序并对WINAPI有所了解.我们想尽快发布这个软件,这个bug必须消失.

c++ debugging assembly exception

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

如何在x86和x64平台之间使用boost :: serialization

我有一个程序在Windows下作为64位应用程序运行.我想要相同的程序作为32位应用程序.它编译,链接和运行,但我无法读取我在32位应用程序中使用64位应用程序存储的文件.我使用boost :: serialization和二进制存档来编写和读取文件.

该软件已经发布给客户端.客户端应该能够读取64位应用程序使用32位应用程序存储的文件.这可能吗?怎么样?任何费用?

c++ compatibility serialization boost 32bit-64bit

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

何时以及如何在D中使用`const`和`immutable`?

在许多现代语言中,const应该使用正确性来阐明接口和意图,并为编译器提供一些优化的机会.在D中,存在真正不可变数据的很酷的特征.应该如何constimmutable使用?我有点想,更喜欢const作为函数参数和immutable局部变量的限定符似乎是编写代码的好方法,但是只要你想要一个带有引用或指针的结构,如数据成员(私有或非私有),不可变的变量,你不能这样做.

struct S {
    private int[] data;
}

void main() {
    immutable s = new S; // won't work, since members aren't immutable
}
Run Code Online (Sandbox Code Playgroud)

因此,struct如果我使用不可变的话,更改a的实现会破坏我的代码.我是否更喜欢const局部变量并仅在必要时使用不可变?指导方针是什么?

d const-correctness immutability

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

有没有办法找出线程是否被阻止?

我正在用C++编写一个线程池类,它接收要并行执行的任务.如果可能的话,我希望所有核心都忙,但有时一些线程处于空闲状态,因为它们被阻塞了一段时间以进行同步.当发生这种情况时,我想启动一个新线程,以便总有大约与cpu核心一样多的线程清醒.为此,我需要一种方法来确定某个线程是醒着还是睡眠(被阻塞).我怎么能找到这个?

我更喜欢使用C++ 11标准库或提升以实现可移植性.但如果有必要,我也会使用WinAPI.我在Windows 7上使用Visual Studio 2012.但实际上,我希望有一种可移植的方式来实现这一点.

优选地,该线程池应该能够掌握类似的情况

MyThreadPool pool;
for ( int i = 0; i < 100; ++i )
    pool.addTask( &block_until_this_function_has_been_called_a_hundred_times );
pool.join(); // waits until all tasks have been dispatched.
Run Code Online (Sandbox Code Playgroud)

函数block_until_this_function_has_been_called_a_hundred_times()阻塞,直到100个线程调用它.此时所有线程都应该继续运行.线程池的一个要求是它不应该死锁,因为池中的线程数太少.

c++ multithreading blocking threadpool c++11

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

如何使用 `std::error_category` 和 system_error 标头中的其他内容?

C++ 中已经有足够多的错误处理策略。我们有异常处理、错误返回码和这些ERRNO乱七八糟的东西。什么样的角色在system_error这里头玩?我如何使用那里的功能?对我来说,它看起来只是随机组合在一起。我使用cppreference站点作为参考。

c++ error-handling c++11 system-error

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

如何派生和添加新参数到构造函数的基本版本?

我正在尝试使用一些数据成员扩展基类,因此除了我的基类需要的构造函数参数之外还需要一些额外的构造函数参数.我想将第一个构造函数参数转发给基类.这是我试过的:

#include <string>
#include <utility>

struct X
{
    X( int i_ ) : i(i_) {}
    int i;
};

struct Y : X
{
    template <typename ...Ts>        // note: candidate constructor not viable: 
    Y( Ts&&...args, std::string s_ ) // requires single argument 's_', but 2 arguments 
//  ^                                // were provided
    : X( std::forward<Ts>(args)... )
    , s( std::move(s_) )
    {}

    std::string s;
};

int main()
{
    Y y( 1, "" ); // error: no matching constructor for initialization of 'Y'
// …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor variadic-templates c++11

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

C++ - std :: enable_if用于更多类型

我有一个功能:

template <typename T,
  typename std::enable_if <std::is_same<T, int>::value == true>::type* = nullptr>
void test(T i)
{
   //process data
}
Run Code Online (Sandbox Code Playgroud)

有用.

但是,我需要启用此功能不仅为int,但floatconst char *,以及...如何做到这一点,而无需编写相同的方法3X倍?

c++ templates c++11

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

调试Qt信号和插槽有哪些最佳实践?

调试信号和插槽可能很难,因为调试器在发出时不会跳转到信号的插槽.调试Qt信号和插槽有哪些最佳实践?

特别是

  1. 如何确保成功建立连接?
  2. 我何时应该使用信号和插槽,何时应该避开它们?
  3. 根据您的经验,最有效的调试技术是什么?

debugging connection qt signals-slots

4
推荐指数
1
解决办法
4261
查看次数

std :: function在调用内部可变lambda时是否锁定了一个互斥锁?

除非另有说明,否则C++标准库提供有关其类型的以下保证:

(1)读操作(即处理const对象)是线程安全的.这意味着只要没有线程同时const向对象写入(应用非操作),多个线程可以同时从对象读取而没有竞争条件.

(2)多个线程可以同时读写任意对象,只要每个对象一次最多只能被一个线程访问.

标准库需要用户类型的相同保证.(您可以在GotW#95中阅读这些内容,或者在C++和2012年之后观看Herb解释此事.)

现在我的问题是,如果以下结论是正确的:由于operator()of std::function是一个const成员函数,它必须是线程安全的.如果在构造中传入的仿函数具有const operator()成员函数,则该std::function对象可以假定它是线程安全的并且只是转发调用.但是,如果在构造中传递给它的仿函数有一个可变的operator(),那么这个操作不需要是线程安全的,但std::function仍然需要,因为调用操作符仍然是const.因此std::function必须外部同步对存储的可变仿函数的调用,因此使用互斥锁.这意味着在将可变lambda传递给一个构造函数的情况下会产生性能开销std::function.

这个推理是否正确?如果是,那么当前的实现是否合规?

c++ mutex locking functor c++11

4
推荐指数
1
解决办法
1659
查看次数