我在头文件中定义了以下函数(该库是目标只是头文件的一部分):
typedef bool (*FieldComparer)(const std::string&, const std::string&);
inline FieldComparer
GetComparer(const std::string& query, string& separator)
{
if (query.find('=') != std::string::npos) {
separator = "=";
return [](const string& s1, const string& s2) { return s1 == s2; };
}
else if (query.find('^') != string::npos) {
separator = "^";
return [](const string& s1, const string& s2) { return boost::starts_with(s1, s2); };
}
else if (query.find('*') != string::npos) {
separator = "*";
return [](const string& s1, const string& s2) { return boost::contains(s1, s2); }; …
Run Code Online (Sandbox Code Playgroud) 因为我不习惯Eclipse,所以我的项目的子文件夹是"源"和"普通"文件夹.这不是什么大问题,因为那些是Makefile项目,但让我的文件夹没有按字母顺序排列(首先显示源文件夹)让我感到困扰.
我想将我的"普通"文件夹转换为"源"文件夹但我在所述文件夹上的右键菜单中找不到任何相关内容,也没有在"属性"窗口中找到相关内容.
有没有办法转换不涉及.cproject
手动编辑文件的文件夹类型?如果没有,我可以只编辑sourceEntries
标签(它似乎到目前为止工作)?
我正在使用CDT 8.0.2.
有没有办法在Makefile中编写"标准"注释,以便以后将它们提供给类似Doxygen的程序,以便输出一个好的(HTML或man)文档?我想在某个地方清楚地概述我的主要目标,但没有什么太花哨的.
有谁知道窗口最大化时发送的 WM_MESSAGE (通过在标题栏中按下最大化按钮,或通过双击标题栏?)
是否有关于按下最大化按钮的 Windows 消息?
Win32/C++,谢谢。
我正在寻找一种有效的方法来修剪或复制现有std :: vector的子集.符合子集/保留条件的元素的标准是它们的索引包含在单独的预定义std :: vector中.
e.g std::vector<String> Test = { "A", "B", "C", "D", "E"}
std::vector<int> SelectionV = {1,2,5}
Result = {"A", "B", "E"}
Run Code Online (Sandbox Code Playgroud)
我将在一个非常大的向量上执行此操作,并且可能定期执行此操作,因此我正在寻找尽可能有效的方法.
我也在考虑另一种选择,但又不确定一种有效的方法是......
当对象Test被填充时(在我的情况下它是第三方定义的对象),它是使用迭代器进行单次传递的结果(不能直接访问元素).我想知道是否可以只添加出现在SelectionV中定义的计数中的Test向量元素
例如
int count = 0
for (Iterator.begin, Iterator.end(), Iterator++) {
if (count is a number contained in selectionV)
add to Test
}
Run Code Online (Sandbox Code Playgroud)
但我认为这会导致每次迭代都会通过selectionV,这比简单地添加所有元素并稍后选择子集要低得多.
任何帮助非常感谢.
我有一个旨在存储用户定义数据(即从插件)的结构.它具有这样的char[]
具有给定最大尺寸的存储该数据.
struct A
{
// other members omitted
// data meant to be type punned, only contains PODs
char data[256];
};
Run Code Online (Sandbox Code Playgroud)
然后是一个示例用户结构,它具有一个静态函数来自己投射A
.
struct B
{
int i;
double d;
static B& FromA_ref(A& a)
{
// static_assert that sizeof(B) < sizeof(A::data)
return * reinterpret_cast<B*>(a.data);
}
};
Run Code Online (Sandbox Code Playgroud)
我编译g++ -O3 -std=c++0x -Wall -o test test.cpp
(GCC 4.6.1).
这会触发dereferencing type-punned pointer will break strict-aliasing rules
警告.我认为这样可以,因为我使用了一个char[]
存储器,我认为它将遵循相同的规则char*
.我觉得很奇怪,事实并非如此.不是吗?好吧,......我现在无法改变它,所以让我们继续吧.
现在让我们考虑以下方法:
struct B
{
....
static B* FromA_ptr(A& …
Run Code Online (Sandbox Code Playgroud) 我将“微不足道的可移动”定义为
调用移动构造函数(或移动赋值运算符)相当于将字节 memcpy 到新目标,而不是对移出的对象调用析构函数。
例如,如果您知道此属性成立,则可以使用它realloc
来调整 std::vector 或内存池的大小。
失败的类型通常会有指向其内容的指针,需要由移动构造函数/赋值运算符更新。
我可以找到的标准中没有这样的类型特征。我想知道这是否已经有一个(更好的)名称,是否已经被讨论过以及是否有一些库利用了这样的特性。
编辑1:
从前几条评论来看,std::is_trivially_move_constructible
并不std::is_trivially_move_assignable
等同于我正在寻找的内容。我相信他们会给出true
包含指向自身的指针的类型,因为读取您自己的成员似乎属于“琐碎”操作。
编辑2:
当正确实现时,指向自身的类型将不再是 trivially_move_constructible 或 move_assignable,因为 move ctor / move 赋值运算符不再是微不足道的。不过,我们应该可以说,只要我们不调用它的析构函数,unique_ptr 就可以安全地复制到新位置。
我们有一个要使用 AVX2 编译的翻译单元(仅此一个):\n它告诉 GCC\xc2\xa0upfront,文件中的第一行:
\n\n#pragma GCC target "arch=core-avx2,tune=core-avx2"\n
Run Code Online (Sandbox Code Playgroud)\n\n这曾经适用于 GCC 4.8 和 4.9,但从 6 开始(也尝试过 7 和 8),我们收到此警告(我们将其视为错误):
\n\nerror: SSE instruction set disabled, using 387 arithmetics\n
Run Code Online (Sandbox Code Playgroud)\n\n在第一个返回浮点数的函数上。我尝试像这样启用 SSE 4.2 (以及 avx 和 avx2)
\n\n#pragma GCC target "sse4.2,arch=core-avx2,tune=core-avx2"\n
Run Code Online (Sandbox Code Playgroud)\n\n但这还不够,错误仍然存在。
\n\n编辑:
\n\n相关编译器标志,我们针对大多数内容以 AVX 为目标:
\n\n-mfpmath=sse,387 -march=corei7-avx -mtune=corei7-avx\n
Run Code Online (Sandbox Code Playgroud)\n\n编辑2:最小样本:
\n\n#pragma GCC target "arch=core-avx2,tune=core-avx2"\n\n#include <immintrin.h>\n#include <math.h>\n\nstatic inline float\nlg1pf( float x ) {\n return log1pf(x)*1.44269504088896338700465f;\n}\n\nint main()\n{\n log1pf(2.0f);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n这样编译:
\n\ngcc -o test test.c …
Run Code Online (Sandbox Code Playgroud) 为什么-rdynamic不导出.a文件中的符号,而是导出.o文件中的符号?
我在.so文件中有一个应用程序和一个插件.主应用程序使用一系列目标文件和一个静态库链接,如下所示:
CXXFLAGS = $(CXXFLAGS_COMMON) -rdynamic
STATICLIBS = ../Utilities/Utilities.a
...
all:
$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)
Run Code Online (Sandbox Code Playgroud)
(CXX是Ubunut上的g ++ 4.5.2,我主要使用-std = c ++ Ox进行编译)
在这种情况下,不导出Utilities.a中的符号(即"objdump -t a.out | grep symbol"为空).
如果我使用"ar x"来仅仅使用.o来提取.a和.链接中的.o文件,那么这些符号将被插件导出并找到(如果你想知道的话加载了dlopen).
我尝试过使用-Wl,-export-dynamic但没有成功.
如上所述,我确实有一个解决方法,但我仍然希望了解我所缺少的内容.提前致谢 !
在尝试我的代码回答另一个问题时,我发现以下内容没有编译
#include <iostream>
#include <cstring>
#include <sstream>
#include <string>
using namespace std;
// (main omitted)
const char * coin = "3D";
istringstream ss(string(s));
int i;
ss >> hex >> i; <--- error here
cout << (char) i << endl;
Run Code Online (Sandbox Code Playgroud)
它因以下错误而失败:
test.cpp:15:11: error: invalid operands of types ‘std::istringstream(std::string) {aka std::basic_istringstream<char>(std::basic_string<char>)}’ and ‘std::ios_base&(std::ios_base&)’ to binary ‘operator>>’
Run Code Online (Sandbox Code Playgroud)
以下编译并正确运行:
const char* coin = "3D";
string s(coin);
istringstream ss(s); // or directly istringstream ss("3D")
int i;
ss >> hex >> i;
cout << (char) i …
Run Code Online (Sandbox Code Playgroud) 管理联合的未初始化字节的规则是什么?(假设有些是初始化的)
下面是一个32字节的并集,我通过第一个成员初始化前16个字节.似乎剩余的字节是零初始化的.这对我的用例很有用,但我想知道这背后的规则是什么 - 我在期待垃圾.
#include <cstdint>
#include <iostream>
using namespace std;
union Blah {
struct {
int64_t a;
int64_t b;
};
int64_t c[4];
}
int main()
{
Blah b = {{ 1, 2 }}; // initialize first member, so only the first 16 bytes.
// prints 1, 2, 0, 0 -- not 1, 2, <garbage>, <garbage>
cout << b.c[0] << ", " << b.c[1] << ", " << b.c[2] << ", " << b.c[3] << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经编译了GCC …
我在C++中复制一个数组,这里是代码:
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *source = arr1;
size_t sz = sizeof(arr1) / sizeof(*arr1); // number of elements
int *dest = new int[sz]; // uninitialized elements
while (source != arr1 + sz)
*dest++ = *source++; // copy element and increment pointers
int *p = dest;
while (p != dest + sz) {
cout << *p++ << endl;
}
Run Code Online (Sandbox Code Playgroud)
运行上述代码后,我得到了:
714124054
51734
9647968
9639960
0
0
0
0
0 …
Run Code Online (Sandbox Code Playgroud) 我正在用C#设计一个ATM系统,对于登录功能,我使用一个SQL服务器数据库来比较输入的卡号和密码与数据库中的密码.当输入正确的卡号和密码时,一切正常,但是当输入的值不正确时,根本没有任何事情发生,我现在已经试图解决它.有没有人对它可能有什么想法?甚至我的大学讲师都不知道!
//Select all fields from the table 'ATMCards' using the connection previously created and use the SqlDataReader to read the values
Run Code Online (Sandbox Code Playgroud)
为了简化它我只是将messagebox.show放在else中,因为我想要做的就是至少让它触发!
SqlCommand cmd = new SqlCommand("SELECT * FROM [ATMCards] WHERE (cardNumber = @cardNumber) AND (PIN = @PIN)", cn);
cmd.Parameters.AddWithValue("@cardNumber", cboxSimCard.Text);
cmd.Parameters.AddWithValue("@PIN", txtboxPIN.Text);
cmd.Connection = cn;
SqlDataReader r = null;
r = cmd.ExecuteReader();
//While the reader is in execution:
while (r.Read())
{
//ADD IF NOT CONFISCATED DO THIS:
if (((Boolean)(r["confiscated"]) == notConfiscated))
{
string cNum = r["cardNumber"].ToString();
string pin = …
Run Code Online (Sandbox Code Playgroud) c++ ×9
gcc ×2
avx2 ×1
c ×1
c# ×1
c++11 ×1
eclipse-cdt ×1
gcc4.7 ×1
iostream ×1
makefile ×1
performance ×1
sample ×1
sql ×1
stl ×1
subset ×1
type-punning ×1
type-traits ×1
unions ×1
vector ×1
visual-c++ ×1
winapi ×1