我编写了这个C ++ 11 trait模板来检查一个types是否完整: template <typename…> using void_t = void; template <typename T, typename = void> struct is_complete : std::false_type {}; template <typename T> struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type {}; 并像这样testing它: struct Complete {}; int main() { std::cout << is_complete<Complete>::value << is_complete<class Incomplete>::value << '\n'; } 我期望testing程序打印10 ,这是我得到的输出,当我编译与叮当3.4。 但是,使用gcc 4.9编译时,它会打印11字符 – 错误地将class Incomplete完整的class Incomplete识别为完整的。 我不知道我的代码是否正确,但在我看来,即使它是错误的,它应该在两个编译器上performance相同。 […]
我一直在C中工作了很长时间,编译器通常会在extern的开始处加上一个下划线这一事实才被理解……然而, 今天的另一个SO问题让我想知道为什么添加下划线的真正原因。 一篇维基百科文章声称,原因是: C编译器通常会在所有外部作用域程序标识符前面加下划线,以避免与运行时语言支持的影响相冲突 我认为至less有一个真理的核心,但似乎也没有真正回答这个问题,因为如果下划线被添加到所有的外部实体,它将不会帮助防止冲突。 有没有人有关于领导下划线的理由的良好信息? Unix creat()系统调用不是以'e'结尾的原因是否增加了下划线部分? 我听说一些平台上的早期连接器对名称有6个字符的限制。 如果是这样的话,那么对外部名称加下划线似乎是一个彻头彻尾的疯狂的想法(现在我只有5个angular色可以玩…)。
我有一个IEnumerable<string >,我想分成三个组,如果我的input有6个项目,我会得到一个IEnumerable<IEnumerable<string>>返回两个项目,其中每个将包含一个IEnumerable<string>哪我的string内容在里面。 我正在寻找如何使用Linq而不是简单的for循环 谢谢
我有一个函数声明如下: template <typename T> T read(); 并定义如下: template <typename T> T packetreader::read() { offset += sizeof(T); return *(T*)(buf+offset-sizeof(T)); } 但是,当我尝试在我的main()函数中使用它时: packetreader reader; reader.read<int>(); 我从g ++得到以下错误: g++ -o main main.o packet.o main.o: In function `main': main.cpp:(.text+0xcc): undefined reference to `int packetreader::read<int>()' collect2: ld returned 1 exit status make: *** [main] Error 1 任何人都可以指出我正确的方向?
我只是学习c ++(自从我多年前参加了一周的夏令营以来,第一天就在看这个) 我正在把我正在使用Java的程序转换为C ++: #ifndef ADD_H #define ADD_H #define _USE_MATH_DEFINES #include <iostream> #include <math.h> using namespace std; class Evaluatable { public: virtual double evaluate(double x); }; class SkewNormalEvalutatable : Evaluatable{ public: SkewNormalEvalutatable(); double evaluate(double x){ return 1 / sqrt(2 * M_PI) * pow(2.71828182845904523536, -x * x / 2); } }; SkewNormalEvalutatable::SkewNormalEvalutatable() { } double getSkewNormal(double […]
我理解了PROPERTIES超过FIELDS的优点,但是我觉得使用AUTO实现的属性而不是MANUAL实现的属性并没有提供任何优势,只是让代码更加简洁一些。 我感觉更舒适的使用: private string _postalCode; public string PostalCode { get { return _postalCode; } set { _postalCode = value; } } 代替: public string PostalCode { get; set; } 主要是因为如果我想要做任何自定义的get和set的实现,我必须创build自己的属性,无论如何由私人领域支持。 那么,为什么不从一开始就咬住子弹,为了一致性而立即给予所有属性这种灵活性? 考虑到您在Visual Studio中所要做的只是点击您的私有字段名称,然后按Ctrl + E,就完成了。 如果我手动执行,那么最终会出现一些不一致性,其中有一些由专用字段支持的手动创build的公共属性,以及一些自动实现的属性。 我感觉好多了,无论是全自动还是全手动。 这只是我吗? 我错过了什么吗? 我误解了什么吗? 我是否过分强调一致性? 我总是可以find有关C#特性的合法讨论,几乎总是有利有弊,但在这种情况下,我确实找不到任何人推荐使用自动实现的属性。
我有一些十进制数据,我正在推入一个SharePoint列表,它将被查看。 我想根据我对特定计算的了解来限制结果数据中显示的有效数字的数量。 有时候会是3,所以12345会变成12300,0.012345会变成0.0123。 有时它会是4或5.有没有方便的方法来处理这个问题?
我正在寻找一种方法来将一些数据填充到DLL边界的string中。 因为我们使用不同的编译器,所以我们所有的dll接口都是简单的char *。 有没有正确的方法来传递一个指针到dll函数,以便它能够直接填充string缓冲区? string stringToFillIn(100, '\0'); FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() ); // definitely WRONG! FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() ); // WRONG? FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() ); // WRONG? stringToFillIn.resize( strlen( stringToFillIn.c_str() ) ); 看起来最有希望的是&stringToFillIn [0],但是这是一个正确的方法来做到这一点,因为你会认为string :: data()==&string [0]? 这似乎不一致。 或者吞下额外的分配并避免这个问题是更好的: vector<char> vectorToFillIn(100); FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() ); string dllGaveUs( &vectorToFillIn[0] );
1)如何找出用户正在使用的Windows安装驱动器? 我需要这个导航到DocumentsandSettings中的ApplicationData 。 2)也如何获得用户名,以便我可以转到ApplicaitionData。 例如:“D:\ Documents and Settings \ user \ Application Data”。
我有一个DataTable有5列: ID 名称 帐号 科 量 DataTable包含5行。 如何将标签控制中的金额列的总和显示为“总金额”?