小编Ros*_*ost的帖子

如果从C++ 11中的B派生出来,如何有条件地调用B :: f?

在使用静态多态性的情况下,特别是在模板中(例如,使用策略/策略模式),可能需要调用基函数成员,但是您不知道实际上是否实际派生自此基类的类.

这很容易用旧的好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)

c++ templates c++11 c++14

20
推荐指数
2
解决办法
1099
查看次数

你什么时候使用模板显式实例化?

我刚刚阅读有关模板显式实例化的内容:

template struct MyStruct<long>;

它被描述为"非常罕见",所以它在什么情况下会有用?

c++ templates explicit-instantiation

19
推荐指数
3
解决办法
3227
查看次数

将静态链接的elf二进制文件转换为动态链接

我有一个静态链接到libc的精灵二进制文件.我无法访问其C代码.我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准libc版本相比可以提供更低的延迟.OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本.但是,由于此elf二进制文件是静态链接的,因此无法使用套接字API的OpenOnload版本.

我相信可以通过以下步骤将此二进制文件转换为与OpenOnload动态链接:

  1. 添加新的程序头:PT_INTERP,PT_DYNAMIC和PT_LOAD.
  2. 在PT_DYNAMIC中添加条目以列出与libc的依赖关系.
  3. 在新的PT_LOAD部分中为所需的libc函数添加PLT存根.
  4. 修改libc函数的现有二进制代码以跳转到相应的PLT存根.

作为第一个剪辑,我尝试添加3个PT_LOAD段.在现有PT_LOAD段标头之后添加了新的段标头.此外,未修改现有段的vm_addr.基于p_align将现有段的文件偏移量下移到下一个对齐的地址.在文件末尾的文件中添加了新的PT_LOAD段.

在重新编写文件之后,当我运行它时,它被内核正确加载,但随后它立即发生了故障.

我的问题是:

  1. 如果我只是在elf二进制文件中移动文件偏移量而不修改vm_addresses,那么运行二进制文件时是否会导致任何错误?
  2. 我可以做我正在尝试的事情吗?有人试过吗?

c linux elf openonload

9
推荐指数
1
解决办法
1803
查看次数

C++为什么向量初始化会调用复制构造函数

以下列方式初始化向量时:

std::vector<MyClass> MyVec(10);
Run Code Online (Sandbox Code Playgroud)

它调用默认构造函数一次,然后再调用复制构造函数10次.因此,如果我理解正确,向量中的对象都是由复制构造函数创建的.

有人可以解释调用复制构造函数而不是默认构造函数的原因吗?或者甚至只是在没有对象的情况下分配内存?

c++ constructor c++03

8
推荐指数
1
解决办法
2168
查看次数

如何创建C++模板以最佳方式传递值?

我似乎记得我使用类型的大小来选择参数的值传递或引用传递.

就像是:

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++ templates

6
推荐指数
2
解决办法
422
查看次数

C++ WCHAR操作

我正在用C++开发一个小小的Win32应用程序.我很久以前就研究过C++基础知识,所以现在我因为C++中的字符串而感到困惑.没有WCHARTCHAR只有charString.经过一番调查后,我决定不再使用了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因为我是俄罗斯人,问题可能不清楚.现在让我谈谈这个问题,我会尝试更清楚,更复杂地解释我的问题.

c++ string winapi char wchar

6
推荐指数
1
解决办法
2万
查看次数

如何在模板元编程中使用"默认"值

我面临以下问题:

我有一些通用容器,可以对类型进行一些操作.为简单起见,操作在请求时是线程安全的.并且,要求表示容器中的类型具有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)

c++ templates metaprogramming c++11

6
推荐指数
1
解决办法
341
查看次数

单独的UI线程上的WPF控件?

我正在制作一个媒体播放器,现在..我添加了一个实时搜索功能来搜索歌曲等等(有些东西,如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#

提前致谢 :)

c# wpf user-interface multithreading wpf-controls

5
推荐指数
1
解决办法
1090
查看次数

在头文件中的命名空间std中使用tr1 :: shared_ptr放置是否合法?

在相应的标题中std::tr1::shared_ptr用作std::shared_ptr放置using指令是合法且良好的编程风格吗?像这样:

namespace std
{
   using tr1::shared_ptr;
}
Run Code Online (Sandbox Code Playgroud)

我知道污染整个命名空间是不好的,但这种情况怎么样?有没有隐藏的陷阱?目标编译器是VS2008,但也需要与更高版本兼容.

c++ tr1 visual-studio-2008 visual-c++

5
推荐指数
1
解决办法
635
查看次数

函数指针中的c ++异常规范

码:

#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

c++ exception

4
推荐指数
2
解决办法
911
查看次数

为什么非Unicode应用程序系统区域设置使符号字符集的Unicode字体显示不正确?

我正在尝试显示Wingdings字体的Unicode字符(它的Unicode TrueType字体仅支持符号字符集).它使用相应的区域操作系统设置在我的Win7/64系统上正确显示:

  • 格式:俄语
  • 地点:俄罗斯
  • 系统区域设置(非Unicode应用程序的AKA语言):英语

但是,如果我将系统区域设置切换为俄语,则代码> 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系统区域设置的正确(也是最简单)方法?

c++ unicode winapi fonts non-unicode

4
推荐指数
1
解决办法
1498
查看次数

CString 标记化问题

我正在使用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”之后的第一个字符,还会跳过一次迭代!

c++ mfc tokenize

3
推荐指数
1
解决办法
6172
查看次数

MFC画圈

我刚开始学习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++ mfc

2
推荐指数
1
解决办法
8249
查看次数