小编Tob*_*ght的帖子

我可以默认第一个模板参数吗?

我有一个带有两个typename参数的模板方法(实际上是QObject::connect()- 看到这个答案另一个答案).因为类型名是针对成员指针的,所以当传入的名称引用重载函数时,演绎可能会失败; 当发生这种情况时,我们需要将一个参数强制转换为正确的类型(可能通过将其存储到所需类型的局部变量中)或者使用一个或多个模板参数限定调用.

以一个相关问题为例:

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);
Run Code Online (Sandbox Code Playgroud)

需要写成

QObject::connect<void(QSpinBox::*)(int)>(spinBox, &QSpinBox::valueChanged,
                                         slider, &QSlider::setValue);
Run Code Online (Sandbox Code Playgroud)

或(通过胁迫):

void(QSpinBox::*signal)(int) = &QSpinBox::valueChanged;
QObject::connect(spinBox, signal,
                 slider, &QSlider::setValue);
Run Code Online (Sandbox Code Playgroud)

但是,有时可以推导出第一个模板参数,但后面的参数是必需的.是否有一种简单的方法来默认第一个参数,但是指定其他参数?我在想类似的东西

QObject::connect<auto, void(QSpinBox::*)(int)>(slider, &QSlider::valueChanged,
                                               spinBox, &QSpinBox::setValue);
Run Code Online (Sandbox Code Playgroud)

显然,这不是有效的C++,但我希望它说明了这一点.

我知道我可以写

void(QSpinBox::*slot)(int) = &QSpinBox::setValue;
QObject::connect(slider, &QSlider::valueChanged,
                 spinBox, slot);
Run Code Online (Sandbox Code Playgroud)

但我希望有一个更简洁的语法.

c++ templates argument-deduction

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

在gtest中,你可以尝试/捕获一个调用"exit(1)"的函数吗?

有一个函数需要exit(1)特定的情况,我正在尝试使用gtest对该函数运行单元测试.

我以为我可以在函数调用的情况下使用try/catch exit(1),但它并不适合我.

这是正常的行为吗?如果是这样,我怎么能检测到exit(1)被调用?

c++ googletest

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

什么时候和为什么我要关闭管道?

我只是想了解管道,我正在研究一个例子:

#define _XOPEN_SOURCE 700

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    pid_t p;
    int status;
    int pipefd[2];
    pipe(pipefd);
    p = fork();

    if(p == 0)
    {
        dup2(pipefd[1], 1);
        close(pipefd[0]);
        close(pipefd[1]);

        execlp(argv[1], argv[1], NULL); 
        perror(argv[1]);

        exit(1);
    }

    dup2(pipefd[0], 0);
    close(pipefd[0]);
    close(pipefd[1]);

    execvp(argv[2], argv+2);
    perror(argv[2]);

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

我不明白为什么这段代码在使用之前关闭了pipefd.

为什么在这里关闭?

c pipe

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

一个奇怪的Qt IDE标签出现在Qt窗口的左侧

在此输入图像描述

有没有人遇到这个问题,左边会出现一个新标签'hello world'.我试图删除Qt并重新安装,但'hello world'仍在那里.

qt qt-creator

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

提供移动参数的构造函数的惯用方式

假设我有以下课程:

#include <vector>
class Foo
{
public:
    Foo(const std::vector<int> & a, const std::vector<int> & b)
        : a{ a }, b{ b } {}
private:
    std::vector<int> a, b;
};
Run Code Online (Sandbox Code Playgroud)

但是现在我想考虑构造函数的调用者可能会将临时变量传递给它的情况,并且我想将这些临时变量正确地移动到ab

现在我真的需要再添加 3 个构造函数,其中 1 个a作为右值引用,其中 1 个b作为右值引用,1 个只有右值引用参数吗?

当然,这个问题可以推广到任何数量的值得移动的参数,并且所需构造函数的数量将是参数^2 2^参数。

这个问题也适用于所有函数。

这样做的惯用方法是什么?还是我在这里完全遗漏了一些重要的东西?

rvalue-reference move-semantics c++11

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

使用返回指针正确使用free是什么意思?

我写了一个小示例问题来了解内存分配和释放内存(以防止内存泄漏):

#include <stdlib.h>

long* foo(char str[]) {
    long *nums;
    nums = calloc(2,sizeof(long));

    //something is happening depending on what's inside the char[]

    nums[0] = 57347534;
    nums[1] = 84757;

    return nums;
}

int main() {
    char str1[400] = "This is a test";

    long* retValue = foo(str1);

    //some lines of checking content of "retValue"

    char str2[400] = "This is another test";

    retValue = foo(str2);

    //some more lines of checking content of "retValue"

    char str3[400] = "This is a final test";

    retValue = foo(str3); …
Run Code Online (Sandbox Code Playgroud)

c pointers return-value

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

是否从字符串文字初始化的数组与从单个字符初始化的数组相同?

有两个数组:

char a[] = "Nice you!";     
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
Run Code Online (Sandbox Code Playgroud)

我认为a[]并且b[]完全一样.所以这是我的代码,看看每个数组的最后一个元素后面是什么:

#include <stdio.h>

int main(void)
{
    char a[] = "Nice you!";
    char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};

    char *pa;
    char *pb;
    pa = a;
    pb = b;
    printf("*(pa + 9)= %d\n", *(pa + 9));
    printf("*(pb + 9)= %d\n", *(pb + 9));

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

我的理解是否正确?我不太确定,需要确认.

c arrays string char

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

为什么预定义宏 __STDC_VERSION__ 未定义?

我想知道我当前在 Visual Studio C++ 中使用哪个 C 标准,但我在使用__STDC_VERSION__预定义宏和其他 C99 预定义宏时遇到了问题 - 出现一条错误,表明该标识符未定义,当我使用时,#ifndef __STDC_VERSION__似乎它没有定义。这是否意味着我正在使用 ANSI C?

下面是使用的示例代码__STDC_VERSION__

int main(void) {
   printf("%d\n", __STDC_VERSION__);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c99 visual-c++

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

如何获取向量的返回引用?

我找到了两种方法来获取函数返回的引用.

vector<int> vec1 = {4,5,6};

vector<int>& rtn_vec(void)
{
    return vec1;
}

int main()
{
    vector<int> &vec2 = rtn_vec(); //way 1
    vector<int> vec3 = rtn_vec(); //way2

    vec2[0] = 3;

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

我理解方式1意味着将引用传递vec1&vec2,所以vec2[0] = 3;更改vec1{3,5,6}.

但是关于方式2,我有两个问题:

  1. 为什么我可以将reference(vector<int>&)传递给实例(vector<int>),它是如何工作的?

  2. 方式2是否涉及深层复制?因为我运行此代码,vector<int> vec3 = rtn_vec();似乎只是复制vec1vec3.

c++ reference return-value

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

cppreference 上的partial_ordering 措辞错误

在 CPP Reference 对std::partial_ordering的描述中,它说:

\n
\n

partial_ordering尝试将 a与整数文字以外的任何内容进行比较的程序的行为\xe2\x80\x8b0\xe2\x80\x8b是未定义的。

\n
\n

但随后它记录了一个比较 的两个实例的相等运算符partial_ordering。在我看来这是一个矛盾。

\n

我理解他们想表达的意思:如果您要与整数进行比较,它必须是文字0,否则它是未定义的行为。但现在的措辞方式看起来像是在比较两个partial_ordering实例相互比较似乎也是未定义的行为。

\n

我是不是误读了什么?“尝试比较”不包含平等比较吗?

\n

c++ c++20

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