小编ani*_*nio的帖子

将命名空间添加到 C++ 文件的脚本

所以我有一个巨大的代码库,需要添加一个命名空间。我没有手动执行此操作,而是想到使用 grep、xargs 和 sed 将命名空间添加到所有源文件中...

但我的技能达不到标准。理想情况下

namespace foo 
{
Run Code Online (Sandbox Code Playgroud)

将在所有包含之后添加,并在 .h 文件中的 #endif 之后添加 '}'。

对于 .cpp 文件,在所有包含之后添加“使用命名空间 foo”就足够了。

我一直在搞 sed,但还没有走多远。

任何帮助,将不胜感激。谢谢!

c++ regex linux sed

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

提升asio和shared_ptrs的扩散

我最近开始使用boost.到目前为止,大多数事情都非常直接.但是让我疯狂的一件事是整个提升过程中shared_ptr的扩散.即使在简单的例子中,也使用了shared_ptr.

所以我的问题是,如果我使用boost来接受tcp连接然后处理它们.只要我保证在使用tcp完成之前不会删除在堆上创建的对象(boost :: asio :: ip :: tcp :: socket,以及将为异步方法调用的类)那么我不需要shared_ptr正确吗?

我写了一个简单的tcp服务器和客户端,不使用共享ptr,它的工作原理.但我只是想在外界确认我的评估是正确的.

另外,根据您的经验,您是否曾经需要使用shared_ptr来安抚提升?

c++ boost boost-asio

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

在heredoc部分设置变量

我是一个shell脚本新手,所以我必须做一些愚蠢的事情,为什么这不会起作用:

#!/bin/sh

myFile=$1

while read line
do
ssh $USER@$line <<ENDSSH
ls -d foo* | wc -l 
count=`ls -d foo* | wc -l`
echo $count
ENDSSH
done <$myfile
Run Code Online (Sandbox Code Playgroud)

应打印两行,每行应具有相同的值......但它们不具有相同的值.第一个print语句[ls -d foo*|的结果 wc -l]具有正确的值,第二个print语句不正确,它始终打印为空白.我需要做一些特殊的事情来将值分配给$ count吗?

我究竟做错了什么?

谢谢

bash shell heredoc

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

在python中使用谷歌protobuffers反射

我如何以编程方式为python中的google protobuffer对象的名称设置字段值.我已经检查过文档和API,但它对我来说并不清楚,而且我找不到任何示例.

我想做的事情如下:

protoBufObj.set_field('foo', 42)
Run Code Online (Sandbox Code Playgroud)

谢谢.

python protocol-buffers

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

如果我比较双打,如何让gcc生成警告?

我想在我的代码中捕获双精度的相等比较并获得警告.是否有GCC警告会这样做?

它不是可以在源代码中轻松获取的东西.

c++ gcc warnings

4
推荐指数
2
解决办法
279
查看次数

如何为运算符<< for ostream模板

以下内容不会为我编译.我没有想法......有什么帮助吗?

template<>
inline
std::ostream& operator<< <const std::map<std::string, std::string> > (std::ostream& stream, const std::map<std::string, std::string>& some_map)
{
  return stream;
}
Run Code Online (Sandbox Code Playgroud)

g ++给了我以下错误:

错误:在'<'标记之前的预期初始化程序

编辑:1 好的,因为每个人都告诉我超载,让我举一个对重载没有意义的例子.如果我有这个怎么办:

template <typename T>
inline
std::ostream& operator<<(std::ostream& stream, const T& something)
{
  stream << something.toString();
  return stream;
}

class Foo
{
public:
  Foo(std::string s)
  {
    name = s;
  }

  std::string toString() const 
  {
    return name;
  }

private:
  std::string name;
};

class Bar
{
public:
  Bar(int i)
  {
    val = i;
  }

  std::string toString() const 
  {
    std::ostringstream stream; …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

我可以轻松地创建一个模板函数,它接受任意类型的任意容器并对其进行操作吗?

我正试图让这样的东西起作用:

// This method is wrong, won't work, need your help
template < template <typename T> class U >
void foo(U& u) 
{
  T& blah = *u.begin();
}

int main(int, char**)
{
  vector<int> myVec(4, 10);
  foo<vector<int> >(myVec); // This is how I want to call it, even better if I can leave the parameters out and just do foo(myVec);
  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

真的我想要做的是避免以下因为它似乎多余:

template <typename T, typename U>
void foo(U& u)
{
T& blah = *u.begin(); 
}

int main(int, char**) …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

不能超载功能

所以我有一个模板化的类,当我有特定的类型时,我想重载一个函数的行为,比如说char.对于所有其他类型,让他们做自己的事情.但是,c ++不会让我重载该函数.

为什么我不能重载这个功能?我真的不想做模板专业化,因为那时我已经复制了整个班级.

这是一个展示问题的玩具示例:http://codepad.org/eTgLG932

这里贴出相同的代码供您阅读:

#include <iostream>
#include <cstdlib>
#include <string>

struct Bar
{
  std::string blah() { return "blah"; }
};

template <typename T>
struct Foo
{
public:
  std::string doX()
  {
    return m_getY(my_t);
  }

private:
  std::string m_getY(char* p_msg)
  {
    return std::string(p_msg);
  }

  std::string m_getY(T* p_msg)
  {
    return p_msg->blah();
  }

  T my_t;
};

int main(int, char**)
{
  Foo<char> x;
  Foo<Bar> y;
  std::cout << "x " << x.doX() << std::endl;
  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家的建议.提出了两种有效的解决方案.我可以专门化doX方法,或者专门化m_getY()方法.

在一天结束时,我宁愿保持我的专业而不是公开,所以我接受了Krill的回答.

c++ templates specialization

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

我应该更喜欢 git merge 还是 git merge --squash

我一直在反复思考,但无法完全确定哪个工作流程更好。我应该更喜欢压缩合并到 master 中的分支吗?或者我应该合并它们。

我喜欢 merge -squash 并且一直在使用它。

合并 --squash 的优点:

  1. 更干净的历史。
  2. 使用二分法更容易。

有什么理由我不应该使用 merge --squash 并使用普通的旧合并来代替?

git

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

typedef声明语法理解?

我遇到了这段代码而不知道它是做什么的.你能破译一下吗?

typedef std::map<std::string, bool (Foo::*)()> x_t;
Run Code Online (Sandbox Code Playgroud)

我不明白的部分是地图的价值.我对其有效的c ++语法感到惊讶.

谢谢.

c++

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

uint64 UTC时间

我有一个UTC日期时间没有存储在uint64中的格式,即:20090520145024798 我需要获得此时间的小时,分​​钟,秒和毫秒.通过将其转换为字符串并使用子字符串,我可以非常轻松地完成此操作.但是,这段代码需要非常快,所以我想避免字符串操作.是否有更快的方法,也许使用位操作来做到这一点?哦顺便说一下,这需要在Linux上用C++完成.

c++ bit-manipulation utc

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

rvalues c ++ 0x并移动到堆

好吧,我一直在读rvalues,它们似乎是一个好主意,但有些东西一直困扰着我.特别是移动的主张允许我们窃取资源并避免复制.

我理解移动是有效的,并且确实避免复制堆栈上发生的所有事情,但最终在堆栈上完成的大部分内容会产生一些我们想要复制到堆中的值,这是我认为移动不起作用的地方.

假设int有一个移动赋值运算符,给定以下代码:

struct Foo
{
int x;
};

void doIt()
{
Foo* f = new Foo();
f->x = (2 + 4);
}
Run Code Online (Sandbox Code Playgroud)

因此,在这个例子中,由(2 + 4)得到的rvalue可以推移到f-> x而不是复制.好,太棒了.但是f和f-因此f-> x在堆上并且rvalue在堆栈上.似乎无法避免副本.你不能简单地将f-> x指向rvalue的内存.一旦它结束,那个右值就会被吹走.副本似乎是必要的.

我是对的,我会做一个副本吗?还是我错了?或者我是否完全误解了右值概念?

c++11

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

为什么我不能用这个结构作为值创建一个std :: map

我有以下结构.

struct ShaderObject
{
    const GLchar* File;
    ShaderType Type;
    GLuint Shader;
    ShaderObject(const GLchar* File, ShaderType Type);
};
Run Code Online (Sandbox Code Playgroud)

而这种类型的地图.

typedef map<string, ShaderObject> Shaders;
Run Code Online (Sandbox Code Playgroud)

编译器给我一个错误,链接到执行map.

 Error 1 error C2512: 'ShaderObject::ShaderObject': No appropriate default constructor
 available c:\program files (x86)\microsoft visual studio 11.0\vc\include\map 198 1
Run Code Online (Sandbox Code Playgroud)

我不明白这个错误.我该如何解决?因为我以前从来没有这样的错误,我无法解释,我不确定你需要哪些信息.请随时询问详情!非常感谢!

c++ compiler-construction struct typedef map

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