小编cod*_*der的帖子

你能切换一个 std::any.type() 吗?

我想探索如何使用std::any而不是 void * 或此类构造进行消息传递。所以我创建了一个示例代码来测试这个 - 见下文。

std::any 的使用看起来不错,但我想切换类型以检查 std::any 是哪种类型。这可能是不可能的,而且我知道我可以使用 if/elseif... 块来代替,但是如果我可以创建一个 switch 语句,以便我在具有 10-20 种不同类型的实际代码中使用它,那就太好了它会更具可读性。

#include <string>  
#include <iostream>  
#include <sstream>  
#include <any>  
#include <typeindex>  

struct ints { int a{1}; int b{2}; };
struct strings { std::string a{"string1"}; std::string b{"string2"}; };

void send_msg(std::any item)
{
    switch (item.type().hash_code())       // <------- HERE
    {
        case typeid(ints).hash_code():     // <------- HERE
            std::cout << "ints" << std::endl;
            break;
        case typeid(strings).hash_code():
            std::cout << "strings" << std::endl;
            break;
        default:
            std::cout << "unknown type\n";
    }
} …
Run Code Online (Sandbox Code Playgroud)

c++ any c++17

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

我可以在.pro文件中使用Qt安装路径变量吗?

我想将音频插件复制到目标目录,因为我需要部署它。

它住在 <PATH_TO_QT_INSTALL>\gcc\plugins\audio

我不知道可以使用什么变量来引用/ pro文件中的安装路径。

我要添加的代码行是这样的:

QMAKE_PRE_LINK += cp $$PATH_TO_QT_INSTAL/gcc/plugins/audio/* $$DESTDIR/lib || :;
Run Code Online (Sandbox Code Playgroud)

我可以使用一个称为%{CurrentProject:QT_INSTALL_BINS}我的环境变量$$PATH_TO_QT_INSTAL/gcc/bin,但是我似乎只能在qt creator gui构建设置中使用它,因为这些设置位于.pro.user文件中,因此对我来说并不好。为什么没有qt具有通用的构建设置机制:(...(这只是一个附带问题,无需回答)

我的问题是我该如何在我的pro文件中引用qt安装路径,是否有可以执行此操作的变量,或其他任何方式?

c++ linux deployment qt

6
推荐指数
2
解决办法
2287
查看次数

Git拉错误"无法更新本地参考"如何解决这个问题?

这是错误消息:

 error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken
    From https://bitbucket.org/abc/abc
     ! [new branch]        master     -> origin/master  (unable to update local ref)
Run Code Online (Sandbox Code Playgroud)

当我试图拉,然后它显示"完成有错误,见上文",我忘了我之前做了什么,所以它导致这个错误出现后我拉请求.我该怎么办 ?

git atlassian-sourcetree

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

git浅克隆 - 如何删除“嫁接标签”,它是什么?

所以我们创建了一个模板项目“template_proj.git”。

更新git 版本是:2.14.1 在 Windows 7 教授

我们有一个空的新项目,除了它们有一个带有 .gitignore 文件的提交。假设这些项目之一称为“projectA.git”。

所以我的方法是:

  1. 将 template_proj.git 克隆到名为“Project_A”的文件夹中。为此,我使用:clone template_prog.git --depth=1 --recursive
  2. 移除遥控器: git remote rm origin
  3. 添加新遥控器: git remote add origin projectA.git
  4. 强制合并项目: git pull origin master --allow-unrelated-histories

这很好用。注意:我不只是从模板克隆中删除我的 .git 文件夹的主要原因是它有子模块。

这给了我一个包含 3 个提交的 repo(这正是我想要的):

  • template_proj.git 的提示
  • projectA.git 的提示(且仅提交)
  • 包含两者新合并的提交。

然而,有一个与the tip of template_proj.git提交相关的特殊标签/分支“嫁接” 。我真的不想那样。

所以我的问题:

  • 这是执行此操作的有效方法(即有没有更好的方法)?
  • 我如何摆脱grafted标签?
  • grafted标签是什么?

我一直无法完全理解grafted真正是什么/意味着什么- 我确实搜索了它并找到了一些信息,但仍然不确定。作为 git 搜索中的关键字,它被更常见的项目推翻了(或者我的 google-fu 很弱):(

更新:这里的这个问题也不能完全回答: 浅克隆中的“嫁接”提交究竟是什么?- 因为它并没有真正说明为什么存在嫁接或如何处理它(如果有的话)。.git/info/grafts我的仓库中也没有:文件。

git git-clone

6
推荐指数
2
解决办法
3558
查看次数

有没有办法初始化一个不涉及编写构造函数的新结构变量?

我认为我模糊地回忆起一个较新的c ++标准(可能是它的c ++ 11,或者14?〜?17 ??)允许你初始化一个结构,你可以定义一个结构然后在没有它的情况下初始化它必须编写构造函数.

例如:

struct test
{
    int a;
    int b;
    std::string str;
};

int main()
{
    std::map<int, test> test_map;
    test_map[0] = test(1, 2, "test1"); // This is the line in question
    // Or it might be more like: test_map[0] = test{1, 2, "test1"};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不记得这个特殊初始化的名称(或者它是否存在)!所以我的问题是:

  • 是否有一些新的机制来实现这一点,而无需在结构"test"中编写构造函数?
  • 如果是这样,它叫什么(所以我可以阅读更多关于它).

如果这个"特征"不存在那么请把我从我的痛苦中解脱出来!可能是我的想象力已经成功了......

c++ struct initialization c++11

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

如何在C++中执行命令并获取返回代码stdout和stderr命令

给出以下答案(第一个c ++ 11答案):

如何使用POSIX执行命令并在C++中获取命令输出?

以下是您的实施方便:

#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <array>

std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
    if (!pipe) throw std::runtime_error("popen() failed!");
    while (!feof(pipe.get())) {
        if (fgets(buffer.data(), 128, pipe.get()) != nullptr)
            result += buffer.data();
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这非常适合执行命令(例如std::string res = exec("ls");)并将stdout转换为字符串.

但它没有做的是获取命令返回码(通过/失败整数)或stderr.理想情况下,我想要一种方法来获取所有三个(返回代码,stdout,stderr).

我会满足于stdout和stderr.我想我需要添加另一个管道,但是我无法真正看到第一个管道是如何设置来获得stdout所以我无法想象我将如何更改它以获得两者.

任何人都有任何想法如何做到这一点,或可能有效的替代方法?

更新

看到我的完整的例子这里 witht输出:

Start
1 res: /home

2 res: stdout

stderr
3 res: 
End
Run Code Online (Sandbox Code Playgroud)

您可以看到它3 res:不会以相同的方式打印stderr …

c++ stdout process stderr c++11

6
推荐指数
4
解决办法
4157
查看次数

简单的 rust 通用/模板添加功能

所以我只是在学习 rust - 我已经设置了工具并让它们在结构上工作,交叉编译,链接库等等......我有 C++ 背景)。所以在 C++ 谈话中我想这样做:

C++

template<typename A, typename B>
auto add(A a, B b)
{
    return a + b;
}

int main() {
    std::cout << "add int int:    " << add(1, 2) << std::endl;
    std::cout << "add int double: " << add(1, 2.3f) << std::endl;
    std::cout << "add int float:  " << add(1, 2.3) << std::endl;
    std::cout << "add char int:   " << add('g', 2.3) << std::endl;
    std::cout << "add str str:    " << add(std::string("bob"), std::string("fred")) …
Run Code Online (Sandbox Code Playgroud)

c++ generics templates rust

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

如何在 std::transform 中使用向量中的其他值?

下面的代码只为向量的每个元素加 1:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    // Create vector 1 - print it out
    std::vector<int> v1 {1,2,3,4,5,6,7,8,9};
    for (auto val : v1)
    {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    // Create vector 2 by a transform of vector 1 + 1
    std::vector<int> v2(v1.size());
    std::transform(v1.begin(), v1.end(), v2.begin(),
        [](int val){ return val + 1; });

    // Print out vector 2
    for (auto val : v2)
    {
        std::cout << val << " ";
    } …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm lambda stl

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

如何在不"检查"的情况下获取远程分支

我正在分支"branch-A",并使用命令git branch我可以看到它是本地唯一的分支.

如果我使用git branch -a我可以看到"遥控器/原点/分支-B"的远程副本

我想做的是在本地带上分支-B,但我不想实际检查出来......我的意思是我可以做到这一点,然后检查我的另一个分支回去,但是因为我现在它稍微有些痛苦这样做很多回购.

我在考虑某种取件?但我无法弄清楚如何表达命令.可能吗?

所以我有:

user@pc> git branch
* branch-A
  master
Run Code Online (Sandbox Code Playgroud)

user@pc> git branch -a
* branch-A
  remotes/origin/branch-B
  remotes/origin/branch-A
  remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

我希望能得到:

user@pc> git branch
* branch-A
  branch-B
  master
Run Code Online (Sandbox Code Playgroud)

git branch fetch

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

c ++可以通过引用传递临时lambda(适用于msvc/windows但不适用于gcc/linux)?

可以说我有以下代码片段:

// global variable
std::thread worker_thread;

// Template function
template <typename Functor>
void start_work(Functor &worker_fn)  // lambda passed by ref
{
    worker_thread = std::thread([&](){
        worker_fn();
    });
}
Run Code Online (Sandbox Code Playgroud)

这被称为:

void do_work(int value)
{
    printf("Hello from worker\r\n");
}

int main()
{
    // This lambda is a temporary variable...
    start_work([do_work](int value){ do_work(value) });
}
Run Code Online (Sandbox Code Playgroud)

我开始在MSVC2012上开发.这一切都很好,似乎工作.但是当我在Linux平台上移动到gcc编译器时,我得到以下(缩写)错误:

no known conversion for argument 1 '...__lambda3' to '...__lambda3&'

我的问题:

  • 因此,从错误中我假设lambda是一个临时变量因此无法通过引用传递 - 是吗?
  • 另外 - 任何想法为什么这适用于MSVC? - 它是自动修复我写的吗?

c++ lambda gcc visual-studio-2012

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