小编Dan*_*aum的帖子

为什么两阶段查找无法选择'swap'的重载版本?

我正在研究这个关于实现用户定义类型函数最佳实践微妙问题的这个有趣的答案.(我的问题最初的动机是讨论将名称添加到命名空间的非法性.)swapstd

我不会在这里重新打印上面链接的答案中的代码片段.

相反,我想了解答案.

答案我上面的状态联系在一起,第一代码片段之下,在关于超载swapnamespace std(而不是专门在的命名空间):

如果您的编译器打印出不同的东西,那么它就不能正确地为模板实现"两阶段查找".

然后答案指出,专门swap研究namespace std(而不是重载它)会产生不同的结果(在专业化的情况下是期望的结果).

但是,答案继续进行另外一种情况:为用户定义的模板类专门交换 - 在这种情况下,再次无法实现所需的结果.

不幸的是,答案只是陈述事实; 它没有解释原因.

有人可以详细说明这个答案,并在该答案中提供的两个特定代码片段中描述查找过程:

  • 过载swapnamespace std为用户定义的非模板类(如在联答复的第一代码段)

  • 专注swapnamespace std用户定义的模板类(如链接答案的最终代码段)

在这两种情况下,std::swap都会调用泛型,而不是用户定义的泛型swap.为什么?

(这将阐明两阶段查找的本质,以及实现用户定义swap最佳实践的原因;谢谢.)

c++ templates swap argument-dependent-lookup c++11

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

为什么printf格式的unicode参数没有?

使用printf将双字节字符串格式化为单字节字符串时:

printf("%ls\n", L"s:\\??????Hello");   // %ls for a wide string (%s varies meaning depending on the project's unicode settings).
Run Code Online (Sandbox Code Playgroud)

显然,有些字符不能表示为ascii字符,所以有时我看到双字节字符变成'?'的行为.标记字符.但是,这似乎取决于特定的角色.对于上面的printf,输出是:

s:\
Run Code Online (Sandbox Code Playgroud)

我希望我可以得到类似的东西:

s:\??????Hello
Run Code Online (Sandbox Code Playgroud)

我担心我已经失去了这个例子,但是当我遇到unicode字符时,我想一个字符串,用'?'替换第一个字符串 然后放弃了其余的.

所以,我的问题是,当您将宽字符串格式化为单字节字符串时应该发生什么.这里的文档:http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx说"字符显示到第一个空字符".但是,我没有看到.这是printf中的一个错误,还是我在某处记录的行为,如果有的话,在哪里.

谢谢你的帮助.

UPDATE

感谢人们给我替代使用printf的答案.我将改为另类,但出于好奇,我真的很感兴趣为什么printf没有可靠的记录行为.看起来好像它的实现者竭尽全力使它不起作用.

c c++ unicode visual-studio-2010

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

为什么另一个涉及电话号码REGEX的StackOverflow帖子中的感叹号?

用于电话号码验证的综合正则表达式中,接受的答案有许多注释.其中一个意见的,由@jcmcbeth,提出下面这个简单的正则表达式用来获取用户提交的电话号码的数字:

string.replace("[^\d+!x]", "")
Run Code Online (Sandbox Code Playgroud)

另一位提问者问道why the !x part?,在关于这个建议的正则表达式的评论之后,立即回答,然后在下一条评论中回答:The !x is there to keep any "x" character from getting stripped.

这对我来说很有意义,除了感叹号!.查看正则表达式中字符类的文档,我没有看到感叹号是一个特殊字符,并且在我看来它不需要在x它之前有一个特殊字符.此外,从链接问题的讨论中,我没有看到任何评论表明感叹号可能是电话号码的一部分(这可以解释它包含在否定的字符类中).

有人可以向我解释为什么会出现惊叹号吗?谢谢.

regex

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

JNI_CreateJavaVM()每次运行我的应用程序时都会失败(确切地说)

我有一个Windows MFC应用程序:

(1)加载JVM(JNI_CreateJavaVM())

(2)将主线程附加到JVM(AttachCurrentThread())

(3)加载一些Java类和方法(FindClass()GetMethodID()/ GetStaticMethodID())

(4)注册一些本机回调以供Java代码使用(RegisterNatives())

(5)从JVM中分离线程(DetachCurrentThread())

(6)破坏JVM(DestroyJavaVM())

所有上述功能在我运行应用程序时都会成功.我知道他们成功了,因为除了上面的内容,我还与应用程序交互并成功调用Java静态方法,这些Java方法成功调用了我的本机回调.我的应用程序正常退出,并且可以确定已执行了预期的Java函数和本机回调.

但是,每次运行应用程序时,调用JNI_CreateJavaVM()都会失败(不会填充JavaVM *). 应用程序的运行之间绝对没有任何变化.我只是运行一次(成功,即使没有做任何事情,除了上述6个步骤),优雅地退出,再次运行,它来回失败.前后成功/失败没有例外 - 我可以运行数十次,并且它在成功之间每隔一段时间就会振荡,并且JNI_CreateJavaVM()在线路上失败.

如有必要,我会粘贴更多代码.但是,我希望有人能够了解我所提供的内容.(注意:这是BCGSoft MFC属性表应用程序,但我强烈怀疑这很重要.)

c++ java java-native-interface visual-studio-2010 visual-studio

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

在matlab中传递数组,没有开销(最好是"引用"),以避免复制复杂的代码块?

我在Matlab脚本中有复杂的代码块,它们作用于大型非稀疏数组.该代码对数组中的随机元素以及读取操作执行许多写操作.相同的代码必须针对不同的(大)数组执行(即,相同的代码块,不同的数组变量名称除外).

我不想要只有数组名称不同的长重复代码块.

不幸的是,当我创建一个函数来执行操作时,所以代码块只出现一次,性能会降低10倍或更多(可能是由于复制了数组).但是,我不需要复制数组.我宁愿"通过引用传递",因此函数调用的目的只是为了避免重复的代码块.但是,似乎没有办法避免写时复制语义.

此外,我不可能(据我所知)创建一个脚本(而不是函数)来实现这一点,因为脚本必须包含与调用脚本相同的变量名称,因此我需要为每个数组使用不同的脚本我希望运行脚本,它什么也得不到(我仍然会有重复的代码块).

我已经考虑创建一个别名变量名称来"替换"感兴趣的数组变量名称,在这种情况下,我可以调用脚本并避免重复的代码.但是,我找不到任何在Matlab中创建别名的方法.

最后,我尝试编写一个利用该evalin()函数的函数,并将数组变量的字符串名称传递给此函数,但是虽然这有效,但性能也要慢得多 - 与将值按值传递给函数大致相同(性能至少下降10倍).

我得出的结论是,在Matlab中,在非稀疏数组上执行复杂操作时,避免重复代码块是不可能的,以避免Matlab似乎使用避免重复代码块的任何可能技术所带来的可怕开销.

我觉得很难相信,但我无法找到解决办法.

有没有人知道在Matlab中对多个非稀疏数组执行相同的复杂操作时避免重复代码块的方法?

matlab

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

使用boost :: format的%运算符的自定义类型有哪些要求?

我想知道必须在类中实现哪些函数和/或运算符才能与boost::format %运算符一起使用.

例如:

class A
{
    int n;
    // <-- What additional operator/s and/or function/s must be provided?
}

A a;
boost::format f("%1%");
f % a;
Run Code Online (Sandbox Code Playgroud)

我一直在研究Pretty-print C++ STL容器,它在某些方面与我的问题有关,但这让我进入了几天相关的审查和学习涉及的问题auto和各种其他语言功能.我还没有完成所有这些调查.

有人可以回答这个具体问题吗?

c++ templates boost

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

如何在VS2015(或任何编译器)中实现std :: is_empty <T>?

我当前的问题的灵感来自于试图理解如何std::unique_ptr<T, D>利用模板机制实例化一个模板类,其大小为何T*D(删除器类型)是一个lambda函数类型,但是当D一个函数指针类型时它是一个更大的大小(因为空间需要在unique_ptr实例中分配以存储函数指针).

通过VS2015源代码,我发现std::unique_ptr派生自std::_Unique_ptr_base,而后者又声明了类型的数据成员_Compressed_pair<class _Ty1, class _Ty2, bool = is_empty<_Ty1>::value && !is_final<_Ty1>::value>.类型_Ty1在后一种情况下是删除器的类型,D即该第二unique_ptr在前面段落中提到的模板参数; 也就是说,这个问题背后的动机是我对比_Ty1是一种lambda类型,而_Ty1不是函数指针类型.(实际上,bool正在使用默认值.)

我认识到,is_empty<_Ty1>::valuetrue_Ty1是λ类型的实例(当拉姆达没有捕获的变量,因此具有0的大小); 但它是false何时_Ty1是函数指针类型.

这导致我追求如何std::is_empty定义.

啊!

以下是std::is_empty我在VS2015 C++库源代码中可以找到的完整实现.

在文件中type_traits是这样的:

// TEMPLATE CLASS is_empty
template<class _Ty>
struct is_empty _IS_EMPTY(_Ty)
{   // determine whether _Ty is an empty …
Run Code Online (Sandbox Code Playgroud)

c++ stl type-traits c++11 visual-studio-2015

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

为什么很清楚模板函数实例化不会内联?

关于作为模板参数传递的函数,Ben Supnik提供的社区wiki答案讨论了内联实例化函数模板的问题.

在那个答案是以下代码:

template<typename OP>
int do_op(int a, int b, OP op)
{
  return op(a,b,);
}

int add(int a, b) { return a + b; }

int (* func_ptr)(int, int) = add;

int c = do_op(4,5,func_ptr);
Run Code Online (Sandbox Code Playgroud)

答案继续这样说(关于实例化函数模板的最后一行do_op):

显然这不是内联.

我的问题是:为什么很明显这不是内联的?

c++ templates

7
推荐指数
1
解决办法
1144
查看次数

在C++中使用FillRect()

我是Visual C++中使用Graphics的新手.我只是想制作一个充满颜色的矩形.需要帮助来纠正这个......

RECT rect;
HDC hdc;
hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
rect.left=30;
rect.right=100;
rect.top=50;
rect.bottom=200;
FillRect(hdc,&rect,(HBRUSH)(RGB(40,151,151)));
Run Code Online (Sandbox Code Playgroud)

错误是:

ERROR: The variable 'rect' is being used without being initialized.

c++ graphics gdi visual-c++

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

为什么Boost.Asio不支持基于事件的界面?

我试图了解Boost.Asio,意图使用条件变量和Boost.Asio来实现信号系统.

我已经看到其他StackOverflow问题提升asio异步等待条件变量,boost :: asio异步条件boost条件变量问题,但这些问题/答案都没有令人满意地触及我的一个基本问题:是真的吗那和/或是否存在一个根本原因,Boost.Asio不适用于条件变量,或者与条件变量自然吻合?

我的想法是条件变量是使用操作系统级同步对象在内部实现的(例如,Windows上的boost :: thread :: condition_variable使用Windows操作系统信号量).因为,根据我目前的理解,boost :: asio :: io_service旨在封装操作系统级别的同步对象,因此条件变量似乎很自然.

确实,与文件操作和套接字操作不同,在操作系统级别通常从不存在与信号条件相关联的回调函数(我认为 - 我不确定这一点).但是,在Boost.Asio中实现这样的回调处理程序似乎很简单,只需要用户提供一个回调函数,该函数在条件变量发出信号时被调用 - 正如用户必须为其他函数提供完成处理程序例程一样. boost :: asio :: io_service服务.

例如(这只是一个快速思考,而不是一个完整的原型 - 它没有包含足够的参数来处理notify_one()与notify_all(),也没有说明服务如何知道何时退出,并且可能有其他明显的遗漏或缺陷):

void condition_handler_function() {}
boost::asio::io_service service;
boost::mutex mut;
boost::condition_variable cond;

// The following class is **made up by me** - would such a class be a good idea?
boost::asio::io_service::condition_service
             condserv(service, cond, mut, condition_handler_function); 

condserv.async_wait_on_signal();

service.run(); // when condition variable is signaled by notify_one(),
               // …
Run Code Online (Sandbox Code Playgroud)

c++ boost event-handling boost-asio

7
推荐指数
2
解决办法
5367
查看次数