Tag: C#的

如何在C ++ 11中正确地检查std :: function是否为空?

我想知道如何正确检查一个std::function是否为空。 考虑这个例子: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { … eventFunc(42); } }; 这段代码在MSVC中编译得很好,但是如果我调用doSomething()而不初始化eventFunc ,代码显然会崩溃。 这是预期的,但我想知道什么是eventFunc的价值? debugging器说'empty' 。 所以我解决了这个简单的if语句: void doSomething() { … if (eventFunc) { eventFunc(42); } } 这工作,但我仍然想知道什么是非初始化的std::function ? 我想写if (eventFunc != nullptr)但std::function (显然)不是一个指针。 为什么纯粹的作品? 它背后的魔法是什么? 而且,如何检查它是正确的方法?

内buildtypes的析构函数(int,char等)

在C ++中,下面的代码给出了一个编译器错误: void destruct1 (int * item) { item->~int(); } 这个代码几乎是一样的,我只是键入int到另一个types,并发生了一些奇迹: typedef int myint; void destruct2 (myint * item) { item->~myint(); } 为什么第二个代码有效? 一个int得到一个析构函数是因为它已被typedefed? 如果你想知道为什么有人想这样做:这是来自重构C ++代码。 我们正在删除标准堆,并用自制池replace它。 这要求我们调用placement-new和析构函数。 我知道为基元types调用析构函数是没用的,但是我们希望它们在代码中,以防我们用实际的类来replacePOD。 发现赤裸裸的int不工作,但typedefed的做是一个惊喜。 顺便说一句 – 我有一个涉及模板function的解决scheme。 我们只需在模板中inputdef,一切都很好。

这个结构怎么能有sizeof == 0?

有一个旧post询问sizeof将返回0的构造。 有一些来自高信誉用户的高分回答说,由标准没有types或variables可以有0的大小,我同意100%。 然而,有这个新的答案提出了这个解决scheme: struct ZeroMemory { int *a[0]; }; 我正要对它进行倒票和评论,但是在这里度过的时间教会了我去检查我是否100%确定的事情。 所以…令我惊讶的是gcc和clang显示了相同的结果: sizeof(ZeroMemory) == 0 。 更多的是,一个variables的sizeof是0 : ZeroMemory z{}; static_assert(sizeof(z) == 0); // Awkward… Whaaaat …? Godbolt链接 这怎么可能?

在Dapper.NET中调整CommandTimeout?

我试图通过存储过程通过Dapper运行SQL备份(我的应用程序的其余部分使用Dapper,所以我宁愿保持这部分运行通过它)。 它工作得很好,直到CommandTimeout开始。 using (var c = SqlConnection(connstring)) { c.Open(); var p = new DynamicParameters(); // fill out p c.Execute("xp_backup_database", p, commandType: CommandType.StoredProcedure); } 我知道的唯一CommandTimeout设置是在SqlCommand中。 有没有办法通过Dapper来设置?

更改结构列表中元素的值

我有一个结构列表,我想改变一个元素。 例如 : MyList.Add(new MyStruct("john"); MyList.Add(new MyStruct("peter"); 现在我想改变一个元素: MyList[1].Name = "bob" 但是,每当我尝试这样做,我得到以下错误: 无法修改System.Collections.Generic.List.this [int]的返回值,因为它不是一个variables 如果我使用类的列表,问题不会发生。 我想答案与结构是一种价值types有关。 所以,如果我有一个结构列表,我应该把它们看作是只读的吗? 如果我需要更改列表中的元素,那么我应该使用类而不是结构?

C ++:命名空间 – 如何正确使用头文件和源文件?

考虑一对两个源文件:一个接口声明文件( *.h或*.hpp )及其实现文件( *.cpp )。 让*.h文件如下所示: namespace MyNamespace { class MyClass { public: int foo(); }; } 我已经看到了在源文件中使用名称空间的两种不同的做法: *.cpp显示练习#1: #include "MyClass.h" using namespace MyNamespace; int MyClass::foo() { … } *.cpp显示练习2: #include "MyClass.h" namespace MyNamespace { int MyClass::foo() { … } } 我的问题:这两种做法是否有区别,是否被认为比另一种更好?

constexpr暗示内联?

考虑下面的内联函数: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } 和constexpr等价版本: // Constexpr specifier version #include<iostream> #include<cstdlib> constexpr int f(const int x); constexpr int f(const int x) { return 2*x; } int main(int argc, char* […]

为什么本地var引用导致性能下降很大?

考虑以下简单的程序: using System; using System.Diagnostics; class Program { private static void Main(string[] args) { const int size = 10000000; var array = new string[size]; var str = new string('a', 100); var sw = Stopwatch.StartNew(); for (int i = 0; i < size; i++) { var str2 = new string('a', 100); //array[i] = str2; // This […]

点在多边形algorithm

我看到下面的algorithm工作来检查点是否在这个链接给定的多边形: int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy) { int i, j, c = 0; for (i = 0, j = nvert-1; i < nvert; j = i++) { if ( ((verty[i]>testy) != (verty[j]>testy)) && (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) ) c = !c; } return c; […]

在.cpp文件中的C ++内联成员函数

我知道定义的内联成员函数应该进入标题。 但是如果把函数的实现放到头文件中呢? 我们来看看这种情况: 档案啊 #pragma once #include "Bh" class A{ B b; }; 文件Bh #pragma once class A; //forward declaration class B{ inline A getA(); }; 由于通知包括我必须把执行getA到 B.cpp #include "Bh" #include "Ah" inline AB::getA(){ return A(); } 编译器会内联getA吗? 如果是这样,哪个inline关键字是重要的(头文件或者.cpp文件中的那个)? 有没有另一种方法将内联成员函数的定义放入它的.cpp文件中?