在以下程序中打印"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.
我有两个代码选项:
选项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多次打电话,是否对输出分布的一致性有任何保证?
我正在寻找一个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) 我有一个类存储一个大的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) 我将首先说我是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并得到了同样的错误.链接的正确方法是什么?
我有一个正在编写的程序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成一个静态库,一切正常。我放弃!
我正在使用python模块subprocess调用程序并使用以下命令将可能的std错误重定向到特定文件:
with open("std.err","w") as err:
subprocess.call(["exec"],stderr=err)
Run Code Online (Sandbox Code Playgroud)
我希望只有在出现错误时才创建"std.err"文件,但如果没有错误则使用上面的命令代码将创建一个空文件.我怎么能让python只创建一个文件,如果它不是空的?
我可以在执行后检查文件是否为空,以防万一将其删除,但我正在寻找一种"更清洁"的方式.
我想断言unsigned int是严格正的.我在以下两个选项之间进行辩论:
unsigned int i = 1;
assert(i > 0); /*option 1*/
assert(i != 0); /*option 2*/
Run Code Online (Sandbox Code Playgroud)
我发现自己陷入了布里丹的窘境困境.有什么理由比较喜欢一个吗?
我的代码全部位于我的计算机/ 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 /中的目录它可以自动完成吗?
我有一个函数Foo可以获取两个模板 argsL3HdrType和L4HdrType. 我收到一个数据包并解析它,然后需要调用该函数。我的代码目前看起来像:
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)