我想探索如何使用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) 我想将音频插件复制到目标目录,因为我需要部署它。
它住在 <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安装路径,是否有可以执行此操作的变量,或其他任何方式?
这是错误消息:
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)
当我试图拉,然后它显示"完成有错误,见上文",我忘了我之前做了什么,所以它导致这个错误出现后我拉请求.我该怎么办 ?
所以我们创建了一个模板项目“template_proj.git”。
更新git 版本是:2.14.1 在 Windows 7 教授
我们有一个空的新项目,除了它们有一个带有 .gitignore 文件的提交。假设这些项目之一称为“projectA.git”。
所以我的方法是:
clone template_prog.git --depth=1 --recursivegit remote rm origingit remote add origin projectA.gitgit pull origin master --allow-unrelated-histories这很好用。注意:我不只是从模板克隆中删除我的 .git 文件夹的主要原因是它有子模块。
这给了我一个包含 3 个提交的 repo(这正是我想要的):
然而,有一个与the tip of template_proj.git提交相关的特殊标签/分支“嫁接” 。我真的不想那样。
所以我的问题:
grafted标签?grafted标签是什么?我一直无法完全理解grafted真正是什么/意味着什么- 我确实搜索了它并找到了一些信息,但仍然不确定。作为 git 搜索中的关键字,它被更常见的项目推翻了(或者我的 google-fu 很弱):(
更新:这里的这个问题也不能完全回答: 浅克隆中的“嫁接”提交究竟是什么?- 因为它并没有真正说明为什么存在嫁接或如何处理它(如果有的话)。.git/info/grafts我的仓库中也没有:文件。
我认为我模糊地回忆起一个较新的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)
我不记得这个特殊初始化的名称(或者它是否存在)!所以我的问题是:
如果这个"特征"不存在那么请把我从我的痛苦中解脱出来!可能是我的想象力已经成功了......
给出以下答案(第一个c ++ 11答案):
以下是您的实施方便:
#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 …
所以我只是在学习 rust - 我已经设置了工具并让它们在结构上工作,交叉编译,链接库等等......我有 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) 下面的代码只为向量的每个元素加 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) 我正在分支"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) 可以说我有以下代码片段:
// 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&'
我的问题: