我是否总是必须为从std::fstream类中实例化的对象指定绝对路径?换句话说,有没有办法指定它们的相对路径,例如项目路径?
现在C++中有lambdas,我无法声明本地函数似乎真的很愚蠢......
例如:
我可以在函数体中声明一个类型,甚至可以将其初始化为值表.但我无法创建一个与该数据类型一起使用的辅助函数 - 因为我无法在函数中声明函数,并且我不能在函数外部引用该数据类型,因为它仅在该范围内可用.
有时候将数据类型从函数中拉出来很简单,并在那里定义我的数据类型和辅助函数(本地文件范围) - 但有时它并不是真正合理的解决方案 - 例如在初始化表时内联lambda引用局部范围变量(或this).
是否已经定义了对本地函数的支持是否已经定义,或者为什么编译器编写者难以实现,因此不是标准的一部分?
我知道有一个用于序列化的Boost模块boost::shared_ptr,但我找不到任何东西std::shared_ptr.
另外,我不知道如何轻松实现它.我怕以下代码
namespace boost{namespace serialization{
template<class Archive, class T>
inline void serialize(Archive & ar, std::shared_ptr<T> &t, const unsigned int version)
{
if(Archive::is_loading::value) {T*r;ar>>r;t=r;}
else {ar<<t.get();}
}
}}//namespaces
Run Code Online (Sandbox Code Playgroud)
不起作用.实际上,如果某个对象被多次引用,它将被第一次运行加载ar>>r,之后只会复制一个指针.但是,我们会创建shared_ptr指向它的多个对象,因此会多次破坏它.
有什么想法吗?
关于我正在使用的系统的一些技术细节:
sudo apt-get install libboost-dev)为什么static const成员不能在本地课程中存在的原因是什么?这似乎是一个相当愚蠢的限制.
例:
void foo() {
struct bar {
int baz() { return 0; } // allowed
static const int qux = 0; // not allowed?!?
};
}
struct non_local_bar {
int baz() { return 0; } // allowed
static const int qux = 0; // allowed
};
Run Code Online (Sandbox Code Playgroud)
从标准报价(9.8.4):
本地类不应具有静态数据成员.
是否可以使Visual Studio中的控制台窗口显示在每个编译的屏幕上的相同位置?
每当我编译时我总是要移动它,因为它的起始位置与事物重叠.
在:C++ FAQ - 其他技术问题 - [39.6]对于需要将两个令牌粘贴在一起的宏应该怎么做?
有人可以向我解释原因吗?我所读到的只是相信我,但我不能仅仅相信某事,因为有人这么说.
我尝试了这种方法,但我找不到任何错误:
#define mymacro(a) int a ## __LINE__
mymacro(prefix) = 5;
mymacro(__LINE__) = 5;
int test = prefix__LINE__*__LINE____LINE__; // fine
Run Code Online (Sandbox Code Playgroud)
那么为什么我需要这样做呢(引自网页):
但是,当您使用##时,需要双层间接.基本上你需要为"令牌粘贴"创建一个特殊的宏,例如:
Run Code Online (Sandbox Code Playgroud)#define NAME2(a,b) NAME2_HIDDEN(a,b) #define NAME2_HIDDEN(a,b) a ## b相信我 - 你真的需要这样做!(并且请没有人写信给我说它有时可以在没有第二层间接的情况下工作.尝试用__ LINE__连接一个符号然后看看会发生什么.)
编辑:有人也可以NAME2_HIDDEN在下面宣布之前解释他为什么使用?NAME2_HIDDEN在使用宏之前定义宏似乎更合乎逻辑.这是某种伎俩吗?
在C中允许嵌套结构在结构外部的可见性是否有任何意义,但在C++中却没有?我没有找到任何参考或相关性.
struct a
{
struct b{
};
};
int main(){
struct b var; // allowed in C not in C++.
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个与一些Windows API代码交互的类,现在我必须初始化的一个指针是通过调用初始化它的本机函数来完成的.
我的指针是std::unique_ptr带有自定义删除器的类型,它调用所提供的WinAPI删除函数,但是我不能将带有&address-of运算符的unique_ptr传递给init-function.为什么?
我创建了一个演示我的问题的示例:
#include <memory>
struct foo
{
int x;
};
struct custom_deleter {};
void init_foo(foo** init)
{
*init = new foo();
}
int main()
{
std::unique_ptr<foo, custom_deleter> foo_ptr;
init_foo(&foo_ptr);
}
Run Code Online (Sandbox Code Playgroud)
编译器咆哮并说:
source.cpp: In function 'int main()':
source.cpp:19:21: error: cannot convert 'std::unique_ptr<foo, custom_deleter>*' to 'foo**' for argument '1' to 'void init_foo(foo**)'
Run Code Online (Sandbox Code Playgroud) 这似乎应该是自动的,但显然不是.我有以下代码:
ui.my_label->setText("Test 1...");
ui.my_label->adjustSize();
processThatTakesAbout30SecondsToFinish(files[0].toStdString());
ui.my_label->setText("Finished.");
ui.my_label->adjustSize();
Run Code Online (Sandbox Code Playgroud)
发生的事情是我从未看到"Test1...",GUI似乎挂起,直到下面的函数完成,并且我通常只看到"完成.".
如何在进入该功能之前确保GUI正在更新?
谢谢.
测试代码:
template<typename T>
void test() {
T container { 1, 2, 3 };
std::for_each(container.begin(), container.end(), [](int v) {
cout<<"1st for_each"<<endl;
});
cout<<"xxxxxx"<<endl;
std::for_each(container.begin(), container.end(), [](typename T::value_type v) {
cout<<"2nd for_each"<<endl;
});
}
int main() {
test<vector<int>>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在不同的lambda中使用int i和typename T::value_type vparam类型.
编译cmd:clang++ -std=c++11 -stdlib=libc++ test.cpp -o test
clang 3.1版(branches/release_31)目标:i386-pc-linux-gnu线程模型:posix
结果:
2nd for_each
2nd for_each
2nd for_each
xxxxxx
2nd for_each
2nd for_each
2nd for_each
Run Code Online (Sandbox Code Playgroud)
问题是:为什么要先for_each打印出"2nd for_each"?
编辑:这可能是一个clang ++ bug.
@KennyTM提供了类似的简单代码:
#include <iostream> …Run Code Online (Sandbox Code Playgroud) c++ ×10
c++11 ×4
boost ×1
c ×1
clang++ ×1
debugging ×1
fstream ×1
function ×1
local-class ×1
macros ×1
qt ×1
shared-ptr ×1
static ×1
templates ×1
unique-ptr ×1
visual-c++ ×1