请看下面的简单代码:
class Foo
{
public:
Foo(){}
~Foo(){}
Foo(const Foo&){}
Foo& operator=(const Foo&) { return *this; }
};
static Foo g_temp;
const Foo& GetFoo() { return g_temp; }
Run Code Online (Sandbox Code Playgroud)
我试着auto像这样使用:
auto my_foo = GetFoo();
Run Code Online (Sandbox Code Playgroud)
我希望这my_foo将是一个常量引用Foo,这是函数的返回类型.但是,类型auto是Foo,而不是参考.此外,my_foo是通过复制创建的g_temp.这种行为对我来说并不那么明显.
为了获得引用Foo,我需要这样写:
const auto& my_foo2 = GetFoo();
auto& my_foo3 = GetFoo();
Run Code Online (Sandbox Code Playgroud)
问题:为什么auto推断出GetFoo作为对象的返回类型,而不是引用?
我想知道任何类型的API或解决方法(例如,脚本或注册表)将Windows任务栏移动(或调整大小)到另一个位置,包括另一个监视器(如果是双监视器).当然,我们可以使用鼠标移动任务栏,但我想通过程序或某种自动方式移动任务栏.
我试图找到Win32 API,但似乎没有人做这个工作.
编辑:我对许多人的意见感到惊讶.让我解释为什么我想要它.在我的工作场所,我使用的是双显示器(分辨率不同),任务栏放在左侧显示器上,而主显示器是正确的显示器.但是,我经常通过远程桌面连接到我的工作场所计算机.远程连接后,任务栏位置被切换.这就是为什么我想制作一个可以保存/恢复任务栏位置的简单程序.每天我都要重新安排我的任务栏.而已.我只是希望它为我.
这将是一个非常简单的问题(可能重复),但我无法找到它.
Win32 API提供了一组非常方便的原子操作(作为内在函数),例如InterlockedIncrement发出lock addx86代码.另外,InterlockedCompareExchange映射到lock cmpxchg.
但是,我想在Linux中用gcc做到这一点.由于我正在使用64位,因此无法使用内联汇编.是否存在gcc的内在函数?
我想在进程和进程调用的dll之间共享静态/全局变量.exe和dll位于相同的内存地址空间中.我不希望变量在其他进程之间共享.
详述问题:
说是有一个静态/全局变量x在a.cpp.exe foo.exe和dll bar.dll都有a.cpp,所以变量x在两个图像中.
现在,foo.exe动态加载(或静态)bar.dll.然后,问题是变量x是否由exe和dll共享.
在Windows中,这两个人从不分享x:exe和dll将有一个单独的副本x.但是,在Linux中,exe和dll会共享变量x.
不幸的是,我想要Linux的行为.我首先考虑pragma data_seg在Windows上使用.但是,即使我正确设置了共享数据段,foo.exe也bar.dll从不共享x.回想一下,bar.dll加载到地址空间中foo.exe.但是,如果我运行另一个实例foo.exe,则x共享.但是,我不希望x被不同的进程共享.所以,使用data_seg失败了.
我可以通过在exe和dll之间创建一个唯一的名称来使用内存映射文件,我现在正在尝试.
两个问题:
请查看以下C++ 0x lambda相关代码:
typedef uint64_t (*WEIGHT_FUNC)(void* param);
typedef std::map<std::string, WEIGHT_FUNC> CallbackTable;
CallbackTable table;
table["rand_weight"] = [](void* param) -> uint64_t
{
return (rand() % 100 + 1);
};
Run Code Online (Sandbox Code Playgroud)
我得到一个错误(在Visual Studio 2010中),lambda无法转换为类型WEIGHT_FUNC.我也知道答案:使用std::function object:
typedef std::function<uint64_t (void*)> WEIGHT_FUNC;
Run Code Online (Sandbox Code Playgroud)
但是,我也想知道如何在不使用的情况下接收lambda的类型std::function.它应该是什么类型的?
我想表达以下句子(source_location也是斜体,它没有正确呈现):
每个条目都具有元组的列表:< 源位置,R/W,trip_counter,发生,杀死(在后面说明)>
我目前的解决方法是:
$ \left\langle
\textit{source\_location}, \textit{R/W}, \textit{trip\_counter},
\textit{occurrence}, \textit{killed} \text{(explained in the later)}
\right\rangle $
Run Code Online (Sandbox Code Playgroud)
我正在使用双柱纸.这个<..>太长了,但没有换行,因为它是一个数学.在这种情况下如何自动(或手动)设置换行符?看来,\left\langle和\right\rangle应在单一的数学.所以,很难闯入多个数学.
$<$并且$>$会是另一种选择,但我不喜欢它.
我正在使用Linux和Win32套接字API.在我的程序中,多个线程共享套接字句柄.特别是,多个线程send使用共享套接字句柄(即,相同的端口)进行调用.在这种情况下,我是否必须锁定线程安全?我无法找到答案.我可以做一个测试,但想听听你的经历.
编辑:我知道通过套接字发送数据根本不是原子操作.当然,我们必须使用互斥锁来保证线程安全.但是,我想知道系统API是否可以拥有自己的内部锁.如果是这样,我们可以省略自己的锁定.
这个问题也适用于fprintf功能.我想知道这样的系统API会有自己的锁.根据我的经验,fprintf从多个线程调用并没有杀死我的程序,尽管文件或stdout上有比赛(即输出不一致或不可预测,但程序没有崩溃),暗示fprintf有一个锁来保护他们的内部数据结构.
我不是C#和LINQ的专家.
我有一个Dictionary,我理解一个哈希表,也就是说,键没有排序.
dataBase = new Dictionary<string, Record>()
Run Code Online (Sandbox Code Playgroud)
Record 是一个用户定义的类,它包含给定键字符串的大量数据.
我发现了一个有趣的例子,它通过LINQ 将它转换Dictionary为一个排序的字典:
var sortedDict = (from entry in dataBase orderby entry.Key ascending select entry)
.ToDictionary(pair => pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)
此代码正常工作.结果sortedDict按键排序.
问题:我发现sortedDict仍然是一个哈希表,一种类型:
System.Collections.Generic.Dictionary<string, Record>
Run Code Online (Sandbox Code Playgroud)
我期望得到的字典应该是map在C++ STL中的一种,它通常被实现为(平衡的)二叉树以维持密钥的排序.但是,生成的字典仍然是哈希表.
如何sortedDict保持订购?哈希表不能保存密钥的顺序.C#的实现是Generic.Dictionary不是典型的哈希表?
我想在main功能之前做一些事情.我有多个源文件.在每个文件中,有一些工作需要在之前完成main.这在C++中没有问题,但在C语言中存在问题.
在C++中,这可以通过两种方式完成:
例如, static const int __register_dummy_ = __AddRegisterMetaInfo(...);
但是,在C中,无论哪种方式都是不可能的.显然,没有构造函数.所以,第一种选择本质上是不可能的.
我认为第二个选项是可能的,但不是用C编译的(我只用Visual C++测试过.它给出了C2099.).C只允许常量为非自动变量.
有没有办法在main之前调用一些函数?
编辑:似乎很多人误解了我真正想做的事情.很抱歉以简单的方式撰写此问题.
我需要做的是实现一种C++运行时类信息功能,就像MFC的方法一样.在这种方法中,我需要从所有源代码中获取一些信息.例如,假设每个源文件都有一个类的定义,我想查看所有信息(例如,类名和父类).最简单的方法是在每个文件中放置一个静态构造函数,每个构造函数访问一个全局数据结构并注册其信息.但是,我也想找到一种方法在C中实现类似的东西.所以,简单地调用pre_main_jobin main不能成为我的答案.
请注意,这种滥用静态构造函数的方法也可以在LLVM编译器套件中找到.每个优化/分析功能都作为通过实现.所有这些传递都是通过静态构造函数注册的.
在Win32 API中,有一个字面复制文件的CopyFile.但是,此API不会创建文件夹.例如,我想复制C:\Data\output.txt到D:\Temp\Data\output.txt.但是,目标文件夹D:\Temp和D:\Temp\Data',不存在.在这种情况下,此API失败.
是否有一个方便的API可以自动和递归地在副本上创建目录结构?当然,我可以做这样的功能,但我希望有人已经完成了这个功能.