小编Irb*_*bis的帖子

用于处理自定义异常的类

我想创建一个类,它接受std :: function并允许处理指定的异常,但我不确定它是否可行.

这是一些伪草案:

//exception types
template<class... Args>
class CustomExceptionHandler
{
public:
    CustomExceptionHandler(std::function<void()> clb): clb_(std::move(clb)){}

    void ExecuteCallback()
    {
        try
        {
            clb_();
        }
        /*catch specified exception types*/
    }

private:
    std::function<void()> clb_;
};

//usage
CustomExceptionHandler<std::out_of_range, std::overflow_error> handler(clb);
handler.ExecuteCallback();
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用可变参数模板来获取异常类型并在以后使用它.可能吗 ?

我猜那个元组可能会有所帮助.

c++ c++11

10
推荐指数
1
解决办法
235
查看次数

CMake 工具链文件 - 设置 CMAKE_CXX_FLAGS

我在工具链文件中看到了以下设置 CMAKE_CXX_FLAGS 的方法:

SET(CMAKE_CXX_FLAGS "-m32" CACHE STRING "C++ compiler flags" FORCE)
Run Code Online (Sandbox Code Playgroud)

我应该在工具链文件中使用它而不是

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别?

c++ cmake

7
推荐指数
1
解决办法
2469
查看次数

GTest - 不同类型的参数化测试

我想将参数化测试与类型化测试混合在一起。这是我的尝试:

struct X {};

struct Y {};

template <typename T>
struct MyTestFixture: public ::testing::Test
{
    T t;
};

template <typename T, typename Param>
struct MyTestFixtureWithParam : public MyTestFixture<T>, 
                                public ::testing::WithParamInterface<Param>
{
};

using MyTestFixtureWithXandString = MyTestFixtureWithParam<X, std::string>;

TEST_P(MyTestFixtureWithXandString, Test1)
{
}

INSTANTIATE_TEST_CASE_P(Name, MyTestFixtureWithXandString, 
                        ::testing::Values("a", "b"));

using MyTestFixtureWithYandString = MyTestFixtureWithParam<Y, std::string>;

TEST_P(MyTestFixtureWithYandString, Test1)
{

}

INSTANTIATE_TEST_CASE_P(Name, MyTestFixtureWithYandString, 
                        ::testing::Values("a", "b"));
Run Code Online (Sandbox Code Playgroud)

Gtest 是否包含一些混合 TYPED_TEST 和 TEST_P 的宏,或者上面的代码是实现我的目标的唯一方法?

c++ googletest googlemock

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

从静态库中隐藏符号

我有一个 C++ 共享库 - libA.so. 我使用-fvisibility=hidden标志隐藏符号。应该可见的符号具有以下属性:__attribute__ ((visibility ("default"))). 该库链接到静态库 - libB.a。该静态库 ( libB.a) 中的所有符号应仅对共享库 ( libA.so)可见。我也用 flag 编译了静态库-fvisibility=hidden。我得到了想要的结果 - 来自libB.a的符号仅对libA.so外部世界可见但对外部世界隐藏,例如以下命令nm -C libA.so不显示来自libB.a.

你能解释一下这个标志-fvisibility=hidden是如何在上面的场景中与静态库一起在内部工作的吗?

c++ visibility symbols shared-libraries static-libraries

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

Debian - 如何覆盖软件包的文件

我有两个具有不同名称的 Debian 软件包:configA.deb、configB.deb。两者的控制文件中都有以下几行:

Provides: my-config
Replaces: my-config
Run Code Online (Sandbox Code Playgroud)

并且两者都提供相同的内容 - file: config

当我在已安装 configA.deb 的情况下尝试安装 configB.deb 时,出现以下错误:

dpkg: error processing archive configB.deb (--install):
trying to overwrite '/home/user/configs/config', which is also in package configA.deb
Run Code Online (Sandbox Code Playgroud)

我希望安装 configB.deb 而不先删除/清除 configA.deb 并且不使用 option --force-overwrite。是否可以?

debian deb

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

销毁unique_ptr的不同方法

我用unique_ptr成员分析一个类。可以从不同的线程使用该成员。还有一种销毁该成员的方法:

void uninitialize()
{
    std::unique_ptr<Worker> worker;
    {
        std::lock_guard<std::mutex> guard(mtx_);
        worker = std::move(worker_);
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道该暗示的目的是什么。上面和下面的实现之间有什么区别吗?:

void uninitialize()
{ 
    std::lock_guard<std::mutex> guard(mtx_);
    worker_.reset();
}
Run Code Online (Sandbox Code Playgroud)

Worker没有定义move构造函数。

c++ c++11

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

串流运算符&lt;&lt;与按位取反不能正常工作

我想对存储在stringstream对象中的数据使用按位取反。以下代码可以正常工作:

std::uint8_t x = 0x01;
x = ~x;

std::stringstream buf;
buf << x;
std::string data = buf.str();
std::cout << std::hex << static_cast<int>(data[0]) << std::endl;
//result: fffffffe
Run Code Online (Sandbox Code Playgroud)

当我以这种方式使用按位求反时:

std::uint8_t x = 0x01;

std::stringstream buf;
buf << ~x;
std::string data = buf.str();
std::cout << std::hex << static_cast<int>(data[0]) << std::endl;
//result: 0x2d
Run Code Online (Sandbox Code Playgroud)

我得到了意外的结果。怎么解释呢?如何与运算符<<一起使用按位求反?

c++ c++11

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

git - 在致命消息后继续

解决合并冲突后,我已将文件添加到暂存区。然后我不小心执行了一个带有修改选项的提交命令:

git commit --amend --no-edit
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

fatal: You are in the middle of a merge -- cannot amend.
Run Code Online (Sandbox Code Playgroud)

这是否意味着根本没有执行提交命令?我可以继续使用正确的命令吗?:

git commit --no-edit
Run Code Online (Sandbox Code Playgroud)

git

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

如何将构造函数参数转发给boost :: optional

我有以下简单的结构:

struct X
{
    X(std::string name, int value): name_(name), value_(value){}

    std::string name_;
    int value_;
};
Run Code Online (Sandbox Code Playgroud)

我想将其与boost可选一起使用而不进行复制。这是一个选择:

boost::optional<X> op;
op.emplace("abc", 5);
Run Code Online (Sandbox Code Playgroud)

是否可以不使用emplace函数?(我的意思是一行表达式)

c++ boost c++11 boost-optional

2
推荐指数
1
解决办法
318
查看次数

多次调用 malloc - 高于预期的内存使用量

当我在 Windows 下运行以下 32 位应用程序(调试模式)时,内存使用量达到 2GB 限制并且当 i 等于42885988时循环中断:

for(int i = 0; i < 104857600; ++i)
{
    uint8_t* ptr = (uint8_t*)malloc(1);

    if (!ptr)
    {
        break;
    }

    *ptr = 0;   
}
Run Code Online (Sandbox Code Playgroud)

104857600 那是 100mb 那么如何解释上述程序的行为?

c memory-management

2
推荐指数
1
解决办法
210
查看次数