我有一个类层次结构如下:
class BaseSession : public boost::enable_shared_from_this<BaseSession>
class DerivedSessionA : public BaseSession
class DerivedSessionB : public BaseSession
Run Code Online (Sandbox Code Playgroud)
在派生类函数中,我经常调用这样的函数:
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
Run Code Online (Sandbox Code Playgroud)
由于我正在与shared_ptr管理会议,这工作正常.最近,我发现我shared_ptr对这种情况的使用不是最佳的.这是因为这些会话是单个对象,每个客户端维护一个套接字.如果重新连接套接字,则会话副本将成为僵尸.
作为解决方法,我开始通过shared_ptr引用传递而不是复制.这解决了僵尸问题.
理想情况下,我觉得我应该unique_ptr用来存储会话,然后将引用传递给其他函数.这打开了一大堆蠕虫.
如何将基类unique_ptr对象转换为派生类unique_ptr对象?unique_ptr以下行的版本是什么?
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
Run Code Online (Sandbox Code Playgroud)
我只想要一个会话对象的副本,其他一切都应该是参考.
我有这个要求,我需要从内部找到C++程序的完整路径.对于Windows,我有以下解决方案.argv [0]可能包含也可能不包含完整路径.但我需要确定.
TCHAR drive[_MAX_DRIVE], dir[_MAX_DIR], base[_MAX_FNAME], ext[_MAX_EXT];
TCHAR fullPath[255+1];
_splitpath(argv[0],drive,dir,base,ext);
SearchPath(NULL,base,ext,255,fullPath,NULL);
Run Code Online (Sandbox Code Playgroud)
什么是上述代码的Linux(gcc)等价物?很想看到可移植的代码.
我试图编写一个函数,可以使用C++ 0x的type_traits功能处理char和wchar_t.是的,我知道如何在没有type_traits的情况下完成它,但我想使用type_traits来更好地理解该功能.
template <typename T>
void SplitIt(T* base, T* ext, const std::basic_string<T>& fullFilePath, std::true_type)
{
_splitpath(fullFilePath.c_str(),NULL,NULL,base,ext);
}
template <typename T>
void SplitIt(T* base, T* ext, const std::basic_string<T>& fullFilePath, std::false_type)
{
_wsplitpath(fullFilePath.c_str(),NULL,NULL,base,ext);
}
template <typename T>
std::basic_string<T> GetBaseName(const std::basic_string<T>& fullFilePath)
{
T base[300], ext[50];
SplitIt(base, ext, fullFilePath, /*What goes here?*/);
return std::basic_string<T>(buf) + ext;
}
int main()
{
std::basic_string<TCHAR> baseName = GetBaseName(std::basic_string<TCHAR>(__FILE__));
}
Run Code Online (Sandbox Code Playgroud)
是否有任何type_traits属性可以区分char和wchar_t?
我正在尝试从内存而不是文件中加载 CA 证书。但是我在连接时不断收到握手错误。文件加载完美,内存加载失败。我错过了什么?
std::ifstream file("message_server_ca.crt");
std::vector<char> fileContents((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
boost::asio::const_buffer buffer(&fileContents.at(0),fileContents.size());
bool useFile = false; // switch between file and memory loading.
boost::asio::ssl::context ctx(io_service, boost::asio::ssl::context::sslv23);
ctx.set_verify_mode(boost::asio::ssl::context::verify_peer);
if(useFile)
{
// This works perfectly!
ctx.load_verify_file("message_server_ca.crt");
}
else
{
// This fails the handshake (asio.ssl:336134278)
ctx.use_certificate(buffer,boost::asio::ssl::context_base::pem);
}
client c(io_service, ctx, iterator);
io_service.run();
Run Code Online (Sandbox Code Playgroud) 我有这两张地图,每张地图都存储着10000多个条目:
std::map<std::string,ObjectA> mapA;
std::map<std::string,ObjectB> mapB;
Run Code Online (Sandbox Code Playgroud)
我只想从两个地图中都存在键的地图中检索这些值。
例如,如果在mapA和mapB中都找到了键“ 10001”,那么我要从两个地图中找到相应的对象。类似于对SQL表进行联接。最简单的方法是迭代较小的映射,然后在每次迭代中执行std :: find(iter-> first)来查找合格的键。那也将是非常昂贵的。
相反,我正在考虑维护一个像这样的集合:
std::set<std::string> common;
Run Code Online (Sandbox Code Playgroud)
1)每次插入其中一张地图时,我都会检查它是否存在于另一张地图中。如果是这样,我将密钥添加到上面的通用集中。
2)每次我从一个映射中删除一个条目时,都会从公用集中删除该密钥(如果存在)。
公用集始终维护两个映射中的键。当我想要加入时,我已经有了资格密钥。有更快/更好的方法吗?
我正在审查一位初级同事的代码并遇到以下代码.
void ActionGetId(boost::property_tree::ptree& callInfo);
void ActionPutId(boost::property_tree::ptree& callInfo);
void handler(int type, std::string data)
{
boost::property_tree::ptree callInfo(data);
if(type == 0)
{
_ioService.post(boost::bind(&ActionGetId, callInfo);
}
else
{
_ioService.post(boost::bind(&ActionPutId, callInfo);
}
}
Run Code Online (Sandbox Code Playgroud)
它们通过引用传递局部变量,然后退出函数.最后调用这些函数时,可能不存在局部变量.然而,这个程序不会崩溃.这是怎么回事?
c++ ×6
boost ×2
algorithm ×1
boost-asio ×1
c++11 ×1
dynamic-cast ×1
linux ×1
openssl ×1
type-traits ×1
unique-ptr ×1