是否有可能强制模板来自某个基类,所以我可以调用基类函数?
template <class T>
void SomeManager::Add(T)
{
T->CallTsBaseClassFunction();
//... do other stuff
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Windows 7下的bjam编译提升(64位 - 应该是无关紧要的)
D:\development\boost\boost_1_44\libs\iostreams\build>bjam stage ^
--toolset=msvc-10.0 link=static ^
--build-type=complete ^
-s ZLIB_SOURCE=C:\zlib125-dll ^
-s ZLIB_LIBPATH=C:\zlib125-dll\lib ^
-s ZLIB_INCLUDE=C:\zlib125-dll\include ^
-s ZLIB_BINARY=C:\zlib125-dll
Run Code Online (Sandbox Code Playgroud)
但我只能得到
stage/libboost_iostreams-vc100-mt-gd-1_44.lib
bin.v2/libs/iostreams/build/msvc-10.0/debug/threading-multi/boost_iostreams-vc100-mt-gd-1_44.dll
bin.v2/libs/iostreams/build/msvc-10.0/debug/threading-multi/boost_iostreams-vc100-mt-gd-1_44.lib
bin.v2/libs/iostreams/build/zlib/msvc-10.0/debug/threading-multi/boost_zlib-vc100-mt-gd-1_44.dll
bin.v2/libs/iostreams/build/zlib/msvc-10.0/debug/threading-multi/boost_zlib-vc100-mt-gd-1_44.lib
Run Code Online (Sandbox Code Playgroud)
但是stage/libboost_zlib-vc100-mt-gd-1_44.lib
失踪了.
我编译错了吗?
当我尝试运行我的项目,该项目与boost和自编译的boost/thread库运行良好时,当我包含boost zlib的东西时,我得到以下错误
6>LINK : fatal error LNK1104: cannot open file 'libboost_zlib-vc100-mt-gd-1_44.lib'
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了什么?
我在将一堆文件打包到一个档案中时遇到了麻烦.这个主题的提升文档是非常有限的,我现在在网上搜索了几个小时,但我找不到解决方案.
到目前为止我有什么:
boost::filesystem::ofstream ofsArchive("some.zip");
boost::iostreams::filtering_ostreambuf outFilter;
boost::iostreams::zlib_params zparam(boost::iostreams::zlib::default_compression);
try
{
// set up the filter
outFilter.strict_sync();
outFilter.push(boost::iostreams::zlib_compressor(zparam));
outFilter.push(ofsArchive);
for(each object of some kind)
{
// create a binary serialized file
boost::filesystem::ofstream ofs(filename, std::ios_base::binary);
boost::archive::binary_oarchive bin_oa( ofs );
bin_oa << crazyObject;
// here's where i'm stuck. how to add multiple files to the "some.zip"?
boost::iostreams::copy(ofs, outputArchive);
}
}
catch(boost::iostreams::zlib_error& e){...}
Run Code Online (Sandbox Code Playgroud)
如何将文件添加到zip存档?提供的方法显然不起作用,我只是在文档或头文件中找不到任何关于主题的内容
我想从std :: exception派生,以便将特定信息添加到我的日志文件中,但我无法想象如何从std :: exception访问.what().
此外,我知道在我的异常处理程序中创建一个字符串是不安全的,但我不是这个主题的专家,那么什么是更安全的替代品?
struct Exception : public std::exception, private boost::noncopyable
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
std::string what = message + // and now what? base.what()
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
Run Code Online (Sandbox Code Playgroud)
编辑:我真的以错误的方式问我的问题.我对安全性很感兴趣,我只是觉得拥有更多的日志数据会很好.我错了.
现在,我并没有因为消息字符串抛出bad_alloc而变得如此偏执以防万一之前有一个bad_alloc,我宁愿有一个简洁的消息.据说我改写了一些东西:
struct Exception : public std::exception
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
LOG(what); // write to log …
Run Code Online (Sandbox Code Playgroud) 我有自己的班级"SomeObject",有几个成员.
现在,我有另一个类"WorkingClass"包含此对象作为私有成员.
我的问题是:我想为"SomeObject"创建一个Getter,但我不希望任何人修改它.
哪种方式更好,1还是2?
class WorkingClass
{
private:
SomeObject sObj;
public:
//... 1)
const SomeObject &const GetSomeObject()
{
return mousePosition;
}
//... 2)
const SomeObject *const GetSomeObject()
{
return &mouseMovement;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道你总是可以抛弃const,但是,我只是想让我的代码干净并且安全无虞
编辑:
那我还有一个问题.当我有一个智能指针成员并在课堂上大量使用它,然后突然想要有人访问读取一些值,但没有更多,这将是一个很好的解决方案还是再次冗长?
class X
{
private:
boost::shared_ptr<SomeObject> sob
public:
const const & GetSomeObject()
{
return *sob.get();
}
}
Run Code Online (Sandbox Code Playgroud)
以及如何返回"const boost :: shared_ptr <...> GetX()"?它可能不是真正的必要,但仍然没有用,因为在这种情况下编译器会禁止GetX().reset(..),并且没有const boost :: ...声明这将是允许的无用操作.或者我错了?
我只是找不到从boost xmlarchives中删除版本跟踪的方法.
例
<Settings class_id="0" tracking_level="0" version="1">
<px class_id="1" tracking_level="1" version="0" object_id="_0">
<TestInt>3</TestInt>
<Resolution class_id="2" tracking_level="0" version="0">
<x>800</x>
<y>600</y>
</Resolution>
<SomeStuff>0</SomeStuff>
</px>
</Settings>
Run Code Online (Sandbox Code Playgroud)
我想得到class_id ="0"tracking_level ="0"version ="1"的东西,因为在这种情况下我只是不需要它并想要一个像文件一样的简单干净配置
码
void serialize(Archive & ar, const unsigned int version)
{
ar & make_nvp("TestInt", TestInt);
ar & make_nvp("Resolution", resolution);
ar & make_nvp("SomeStuff", SomeStuff);
}
Run Code Online (Sandbox Code Playgroud)
我发现了boost :: serialization :: track_never,但无处可用
我知道复制mySQL InnoDB文件(frm等)会遇到麻烦.但是,如果我按原样复制整个MSYSQL目录呢?bin,data,docs等.那会有用吗?我相信它应该有效.我对吗?
除非明确设置,否则我认为MySQL不会在MySQL文件夹之外做任何事情.
对于那些想知道为什么我需要这样做的人,我构建了内部网应用程序,我通常只需单击基于WINDOWS的安装程序即可完成这些操作.这意味着准备WAMP/XAMPP SERVER状态,配置和所有虚拟机,然后拍摄快照.
我想在我的代码中实现一个hashmap,所以我决定坚持使用murmurhash3
我目前只提供为x86编译的程序,并试图保持代码通用,所以我从来没有遇到过在x64上运行程序的麻烦.
现在我查看了murmurhash的头文件,该库提供了以下功能:
MurmurHash3_x86_32
MurmurHash3_x86_64
MurmurHash3_x86_128
MurmurHash3_x64_32
MurmurHash3_x64_64
MurmurHash3_x64_128
Run Code Online (Sandbox Code Playgroud)
这是否意味着我必须使用x64函数并提供x64可执行文件才能在x64系统上使用此哈希库?或者我可以简单地使用x86版本,只是遇到较差的性能?
我是否认为_32 _64 _128位版本只是意味着更多位版本提供更好的分发?
谁能告诉我我做错了什么?我试图用murmurhash散列一个值,但每次都得到不同的值:
std::string str = "some test string";
char out[32];
MurmurHash3_x86_32(str.c_str(), str.length(), 0, out);
unsigned int hash = reinterpret_cast<unsigned int>(out);
Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经为某些数据处理分配了缓冲区,之后将其删除.由于代码变得更大并且在某些点可能发生异常,我考虑使用std :: unique_ptr使其更安全并提出了这些解决方案:
unique_ptr<char, void (*)(void *)> p1( (char*)operator new(bufSize), operator delete);
unique_ptr<char[], void (*)(void *) > p2( (char*)operator new(bufSize), operator delete);
memcpy(&((p1.get())[0]), "xyz", 3);
memcpy(&(p2[0]), "xyz", 3);
char x1 = p1.get()[0];
char x2 = p2[0];
Run Code Online (Sandbox Code Playgroud)
对我来说,第一个解决方案(p1)似乎是正确的,但是必须编写(p1.get())[...]
第二个解决方案是方便的,但这是我的问题:
unique_ptr似乎是以支持operator []的特殊方式模板化的,这让我想知道,如果我将unique_ptr与自定义的new和delete操作一起使用,是否有任何操作符[]或任何其他函数可能出错或者是第二个解决方案(p2)罚款?
c++ ×8
boost ×3
hash ×2
zlib ×2
backup ×1
compilation ×1
compression ×1
const ×1
inheritance ×1
innodb ×1
murmurhash ×1
mysql ×1
templates ×1
xml ×1