小编Ben*_*ler的帖子

C++未引用类的静态变量

在以下程序中打印"Here":

#include <iostream>
class Base
{
  static bool temp;
  static bool initTemp()
  {std::cout<<"Here\n";return true;}
};

bool Base::temp = Base::initTemp();

class Derived : public Base
{};

int main() {int a;std::cin>>a;}
Run Code Online (Sandbox Code Playgroud)

在以下程序中,"此处"未打印:

#include <iostream>
template <class T>
class Base
{
  static bool temp;
  static bool initTemp()
  {std::cout<<"Here\n";return true;}
};

template <class T>
bool Base<T>::temp = Base<T>::initTemp();

class Derived : public Base<int>
{};

int main() {int a;std::cin>>a;}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,Base都不会被引用.唯一的区别是在第二种情况下它是一个模板类.谁能向我解释为什么会出现这种情况.我正在使用VS 2012.

c++ static templates

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

随机数的分布

我有两个代码选项:

选项1

int myFunc() {
  return new Random().nextInt();
}
Run Code Online (Sandbox Code Playgroud)

要么:

选项2

private static final Random random = new Random();

int myFunc() {
  return random.nextInt();
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这option 2更具惯用性.我想知道它的有效性option 1.

option 1我将只使用由给定种子生成的第一个数字.在option 2我选择种子并n使用该种子生成数字.IIUC对随机性的保证就是这个用例.

因此,我的问题是,如果我option 1多次打电话,是否对输出分布的一致性有任何保证?

java random uniform-distribution

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

是否有一个 std::variant 包含所有变体

我正在寻找一个std::variant包含所有类型而不是其中一种类型的类。

所以我希望能够写:

std::all_variant<int, double> av{1, 3.14159};
int i = std::get<int>(av); // i should be 1.
double d = std::get<double>(av); // d should be 3.14159
Run Code Online (Sandbox Code Playgroud)

这基本上是一个tuple但保证每个类型只出现一次所以你可以std::get<Type>代替std::get<Index>.

对于上下文,我希望能够编写以下代码(因此,如果有更好的方法,我将不胜感激):

std::all_variant<int, double> av{1, 3.14159};

template <typename T> // T must be either int or double.
void MyFunc(std::all_variant<int, double> av) {
  std::cout << std::get<T>(av);
}

int main() {
  MyFunc<int>(av); // Should print 1.
  MyFunc<double>(av); // Should print 3.14159.
  MyFunc<std::string>(av); // Error! av doesn't have std::string variant. 
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

删除第 3 方类的复制者

我有一个类存储一个大的std::map. 我的理解是,执行此操作的惯用方法是:

class Foo {
 public:
  Foo(/* Note: passed by value */ std::map<Bar, Baz> large_map) : large_map_(std::move(large_map)) {}
 private:
  std::map<Bar, Baz> large_map_;
};

int main() {
  std::map<Bar, Baz> large_map;
  // Work hard to initialize large_map.
  Foo foo = Foo(std::move(large_map));
}
Run Code Online (Sandbox Code Playgroud)

这会将 large_map 的所有权从 main 转移到构造函数 arg,然后转移到 Foo 的成员。问题是代码很难正确使用,我发现有人在某个地方创建了 aFoo并忘记将地图移动到 ctor 中:

void deep_dark_hidden_code() {
  std::map<Bar, Baz> large_map;
  // Work hard to initialize large_map.
  Foo foo = Foo(large_map); // Whoops! The author of this code forgot to …
Run Code Online (Sandbox Code Playgroud)

c++

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

在gcc中链接到so库

我将首先说我是gcc和makefile的新手.我在桌面(〜/桌面)上有一个.so文件lib.so.我想将我的程序(称为myProgram)链接到它.我在makefile中写的是:

g++ myProgram.o -L ~/Desktop -l lib -o myProgram
Run Code Online (Sandbox Code Playgroud)

当我跑步时,make我得到一个错误:

/usr/bin/ld: cannot find -llib
Run Code Online (Sandbox Code Playgroud)

我也试过-l lib.so并得到了同样的错误.链接的正确方法是什么?

linker gcc shared-libraries

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

找不到过程入口点

我有一个正在编写的程序program.exe,它加载了一个 dll lib.dll。当我program.exe在调试模式下运行时,一切正常。当我尝试以发布模式运行时,出现错误:

The procedure entry point ... could not be located in the dynamic link library lib.dll.

当我在 Dependency walker 中打开 dll 时,所有相同的奇怪符号的确切函数都在那里。我查看了 Visual Studio 中的模块窗口,以确保我没有从错误的目录中加载 dll,但事实并非如此。我使用相同的编译器(Visual Studio 2012)编译了 dll 和 exe,所以这也不是问题。什么可能导致这种情况?

编辑:

我转换lib.dll成一个静态库,一切正常。我放弃!

c++ dll visual-studio

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

子进程错误文件

我正在使用python模块subprocess调用程序并使用以下命令将可能的std错误重定向到特定文件:

with open("std.err","w") as err:
    subprocess.call(["exec"],stderr=err)
Run Code Online (Sandbox Code Playgroud)

我希望只有在出现错误时才创建"std.err"文件,但如果没有错误则使用上面的命令代码将创建一个空文件.我怎么能让python只创建一个文件,如果它不是空的?

我可以在执行后检查文件是否为空,以防万一将其删除,但我正在寻找一种"更清洁"的方式.

python error-handling subprocess

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

是非常积极的

我想断言unsigned int是严格正的.我在以下两个选项之间进行辩论:

unsigned int i = 1;
assert(i > 0); /*option 1*/
assert(i != 0); /*option 2*/
Run Code Online (Sandbox Code Playgroud)

我发现自己陷入了布里丹的窘境困境.有什么理由比较喜欢一个吗?

c

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

设置函数参数的工作目录

我的代码全部位于我的计算机/ a/b/c/d/e/myCode上的以下目录中.当我想编译project1时,我很生气地键入make/a/b/c/d/e/myCode/project1.为了解决这个问题,我在bashrc中创建了一个函数,如下所示:

function make_project { make /a/b/c/d/e/myCode/$1; }
Run Code Online (Sandbox Code Playgroud)

然后我称之为:

make_project project1
Run Code Online (Sandbox Code Playgroud)

这很好用.唯一的问题是我没有project1的自动完成功能.因此,如果我有一个名为my_complicatedly_named_project的复杂名称的项目,我将需要输入整个名称.是否有任何方法让bash知道参数是/ a/b/c/d/e/myCode /中的目录它可以自动完成吗?

bash bash-completion

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

如何防止手动实例化所有模板类型?

我有一个函数Foo可以获取两个模板 argsL3HdrTypeL4HdrType. 我收到一个数据包并解析它,然后需要调用该函数。我的代码目前看起来像:

ParsedPacket parsed_packet = parser.Parse(packet);
if (parsed_packet.ip_version() == IPv4 && parsed_packet.ip_proto() == TCP)
  Foo(parsed_packet.L3Header<ipv4_hdr>(), parsed_packet.L4Header<tcp_hdr>());
if (parsed_packet.ip_version() == IPv6 && parsed_packet.ip_proto() == TCP)
  Foo(parsed_packet.L3Header<ipv6_hdr>(), parsed_packet.L4Header<tcp_hdr>());
if (parsed_packet.ip_version() == IPv4 && parsed_packet.ip_proto() == UDP)
  Foo(parsed_packet.L3Header<ipv4_hdr>(), parsed_packet.L4Header<udp_hdr>());
if (parsed_packet.ip_version() == IPv6 && parsed_packet.ip_proto() == UDP)
  Foo(parsed_packet.L3Header<ipv6_hdr>(), parsed_packet.L4Header<udp_hdr>());
Run Code Online (Sandbox Code Playgroud)

我的问题是,有没有办法减少这种代码重复?类似的东西:

Foo<parsed_packet.GetL3HeaderType(), parsed_packet.GetL4HeaderType()>(...);
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为在编译时不知道给定数据包的标头类型。

重复的根源是两个不同的 if 语句正在检查IPv4并将其映射到ipv4_hdr. 如果我可以在代码中的一个地方指定IPv4映射到ipv4_hdrthen 这将使代码随着选项的数量线性增长而不是指数增长,因为我可以以某种方式编写:

if (parsed_packet.ip_version() == IPv4) {
  using L3HeaderType = ipv4_hdr;
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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