在使用静态多态性的情况下,特别是在模板中(例如,使用策略/策略模式),可能需要调用基函数成员,但是您不知道实际上是否实际派生自此基类的类.
这很容易用旧的好C++省略号过载技巧来解决:
#include <iostream>
template <class I>
struct if_derived_from
{
template <void (I::*f)()>
static void call(I& x) { (x.*f)(); }
static void call(...) { }
};
struct A { void reset() { std::cout << "reset A" << std::endl; } };
struct B { void reset() { std::cout << "reset B" << std::endl; } };
struct C { void reset() { std::cout << "reset C" << std::endl; } };
struct E: C { void reset() { std::cout << "reset E" << …Run Code Online (Sandbox Code Playgroud) 我刚刚阅读有关模板显式实例化的内容:
template struct MyStruct<long>;
它被描述为"非常罕见",所以它在什么情况下会有用?
我有一个静态链接到libc的精灵二进制文件.我无法访问其C代码.我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准libc版本相比可以提供更低的延迟.OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本.但是,由于此elf二进制文件是静态链接的,因此无法使用套接字API的OpenOnload版本.
我相信可以通过以下步骤将此二进制文件转换为与OpenOnload动态链接:
作为第一个剪辑,我尝试添加3个PT_LOAD段.在现有PT_LOAD段标头之后添加了新的段标头.此外,未修改现有段的vm_addr.基于p_align将现有段的文件偏移量下移到下一个对齐的地址.在文件末尾的文件中添加了新的PT_LOAD段.
在重新编写文件之后,当我运行它时,它被内核正确加载,但随后它立即发生了故障.
我的问题是:
以下列方式初始化向量时:
std::vector<MyClass> MyVec(10);
Run Code Online (Sandbox Code Playgroud)
它调用默认构造函数一次,然后再调用复制构造函数10次.因此,如果我理解正确,向量中的对象都是由复制构造函数创建的.
有人可以解释调用复制构造函数而不是默认构造函数的原因吗?或者甚至只是在没有对象的情况下分配内存?
我似乎记得我使用类型的大小来选择参数的值传递或引用传递.
就像是:
void fun( check<A> a ){
...
}
Run Code Online (Sandbox Code Playgroud)
生成或:
void fun( A a ){
...
}
Run Code Online (Sandbox Code Playgroud)
要么
void fun( A & a ){
...
}
Run Code Online (Sandbox Code Playgroud)
取决于类型A的大小和编译应用程序的体系结构.
我正在用C++开发一个小小的Win32应用程序.我很久以前就研究过C++基础知识,所以现在我因为C++中的字符串而感到困惑.没有WCHAR或TCHAR只有char和String.经过一番调查后,我决定不再使用了TCHAR.
我认为我的问题非常简单,但我找不到如何在C++中操作字符串的明确指南.受过PHP编码的影响,过去几年我一直期待一些简单的字符串操作并且错了!
简单地说,我需要的是将新数据放入字符串.
WCHAR* cs = L"\0";
swprintf( cs, "NEW DATA" );
Run Code Online (Sandbox Code Playgroud)
这是我的第一次尝试.调试我的应用程序时,我调查过swprintf只将前2个字符放入我的cs var.我用这种方式解决了我的问题:
WCHAR cs[1000];
swprintf( cs, "NEW DATA" );
Run Code Online (Sandbox Code Playgroud)
但通常这个技巧可能会失败,因为在我的情况下,新数据不是恒定值,而是另一个变量,可能比1000个字符长更宽.我的代码看起来像这样:
WCHAR cs[1000];
WCHAR* nd1;
WCHAR* nd2;
wcscpy(nd1, L"Some value");
wcscpy(nd2, L"Another value"); // Actually these vars stores the path for user selected folder
swprintf( cs, "The paths are %s and %s", nd1, nd2);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有可能nd1和nd2总字符数可能大于1000个字符,因此关键数据将丢失.
问题是如何将我需要的所有数据复制到以这种方式声明的WCHAR字符串WCHAR* wchar_var;而不丢失任何东西?
PS因为我是俄罗斯人,问题可能不清楚.现在让我谈谈这个问题,我会尝试更清楚,更复杂地解释我的问题.
我面临以下问题:
我有一些通用容器,可以对类型进行一些操作.为简单起见,操作在请求时是线程安全的.并且,要求表示容器中的类型具有typedef std::true_type needs_thread_safety;.
struct thread_safe_item {
typedef std::true_type needs_thread_safety;
/* */
};
struct thread_unsafe_item {
typedef std::false_type needs_thread_safety;
/* */
};
template<typename TItem> container {
/* some algorithms, that are std::enable_if selected, according to needs_thread_safety */
};
Run Code Online (Sandbox Code Playgroud)
但是,我希望needs_thread_safety选择加入,而不需要定义(=默认false_type).我试过以下:
struct thread_unsafe_item {
/* */
};
template<typename TItem>
struct thread_safety_selector
{
template<typename T>
struct has_defined_thread_safety
{
typedef char yes[1];
typedef char no[2];
template <typename C> static yes& test(typename C::needs_thread_safety*);
template <typename> …Run Code Online (Sandbox Code Playgroud) 我正在制作一个媒体播放器,现在..我添加了一个实时搜索功能来搜索歌曲等等(有些东西,如WMP实时搜索),即当你输入关键字时,搜索就会发生.
在搜索过程中,访问数据库并加载IEnumerable是通过BackGroundProcess在另一个线程上完成的.通过调用UIElement的调度程序来更新UI.
这个过程相当快,但是当您在文本框中输入搜索关键字时,似乎存在一个小的延迟,这是因为Listbox.ItemSource更新需要一些时间.也就是说你要搜索"Adele",当你输入"a"时,搜索功能会加载"A"的结果,但是当我们输入整个单词"Adele"时,它有时间显示"d" ""e"""l""e"并且这些字母之间存在轻微的滞后.
在这个搜索过程中,当我停止更新UI时,搜索过程看起来非常流畅,这只对我意味着Listbox锁定线程,因此当Listbox完成其处理时,播放器的UI的其余部分被卡在那里.
因此,我相信如果我可以将Listbox Control放到另一个UI线程中,无论加载列表框所花费的时间如何,我都可以保持播放器的流畅.仅供参考:数据虚拟化就在那里,ListBox的UI虚拟化正在运行
如何将ListBox控件放到另一个UI线程上?WPF,C#
提前致谢 :)
在相应的标题中std::tr1::shared_ptr用作std::shared_ptr放置using指令是合法且良好的编程风格吗?像这样:
namespace std
{
using tr1::shared_ptr;
}
Run Code Online (Sandbox Code Playgroud)
我知道污染整个命名空间是不好的,但这种情况怎么样?有没有隐藏的陷阱?目标编译器是VS2008,但也需要与更高版本兼容.
码:
#include<iostream>
using namespace std;
void foo() throw(char) {throw 'a';}
int main() try {
void (*pf)() throw(float);
pf = foo; // This should NOT work
pf();
}
catch(const char& c){cout << "Catched ::> " << c << endl;}
Run Code Online (Sandbox Code Playgroud)
为什么即使异常规范与函数指针不同,也可以传递foo给它?这是我的编译器中的错误吗?pffoopf
我正在尝试显示Wingdings字体的Unicode字符(它的Unicode TrueType字体仅支持符号字符集).它使用相应的区域操作系统设置在我的Win7/64系统上正确显示:
但是,如果我将系统区域设置切换为俄语,则代码> 127的Unicode字符显示不正确(替换为框).
我的应用程序是在Visual Studio中使用Unicode Charset创建的,它只调用Unicode Windows API函数.
另外我注意到有几个Windows应用程序也会错误地使用符号字体(符号,Wingdings,Webdings等)显示这些字符,例如Notepad,Beyond Compare 3.但是WordPad和MS Office应用程序不会受到影响.
这是最小的代码片段(为简洁起见,跳过了资源清理):
LOGFONTW lf = { 0 };
lf.lfCharSet = SYMBOL_CHARSET;
lf.lfHeight = 50;
wcscpy_s(lf.lfFaceName, L"Wingdings");
HFONT f = CreateFontIndirectW(&lf);
SelectObject(hdc, f);
// First two chars displayed OK, 3rd and 4th aren't (replaced with boxes) if
// Non-Unicode apps language is NOT English.
TextOutW(hdc, 10, 10, L"\x7d\x7e\x81\xfc");
Run Code Online (Sandbox Code Playgroud)
所以问题是:为什么地狱非Unicode应用程序语言设置会影响Unicode应用程序?
什么是显示SYMBOL_CHARSET字体而不依赖于OS系统区域设置的正确(也是最简单)方法?
我正在使用CString::Tokenize方法来使用分隔符标记字符串,但我注意到一些奇怪的事情,我在循环内的字符串上调用该方法,因为我想检索字符串中的所有标记,这是我的代码:
CString strToken;
for(int nTokenPos = 0; nTokenPos < dialog->myValue.GetLength(); nTokenPos++)
{
//TRACE( "The Size of the string is %d\n", dialog->myValue.GetLength());
TRACE( "Iteration No %d\n",nTokenPos);
strToken = dialog->myValue.Tokenize(_T("X"), nTokenPos);
strToken+="\n";
OutputDebugString(strToken);
}
Run Code Online (Sandbox Code Playgroud)
注意:dialog->myValue是我想要标记的字符串。当我在“99X1596”(例如)上测试该代码时,输出为:
Iteration No 0
99
Iteration No 4
596
Run Code Online (Sandbox Code Playgroud)
另一个例子:'4568X6547' 输出:
Iteration No 0
4568
Iteration No 6
547
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它会忽略分隔符“X”之后的第一个字符,还会跳过一次迭代!
我刚开始学习MFC.我需要画一个圆圈.如果我使用OnPaint()它可以工作.我该怎么做才能在背景上画画?这是正确的功能还是应该更改?
void Cvaja5Dlg::OnRButtonDown(UINT nFlags, CPoint point)
{
CPaintDC dc(this);
dc.Ellipse(0,0,500,500);
CDialogEx::OnRButtonDown(nFlags, point);
}
Run Code Online (Sandbox Code Playgroud) c++ ×11
templates ×4
c++11 ×2
mfc ×2
winapi ×2
c ×1
c# ×1
c++03 ×1
c++14 ×1
char ×1
constructor ×1
elf ×1
exception ×1
fonts ×1
linux ×1
non-unicode ×1
openonload ×1
string ×1
tokenize ×1
tr1 ×1
unicode ×1
visual-c++ ×1
wchar ×1
wpf ×1
wpf-controls ×1