小编Sha*_*ath的帖子

如何使用unique_ptr执行dynamic_cast?

我有一个类层次结构如下:

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++ boost dynamic-cast smart-pointers unique-ptr

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

如何从内部找到C++ Linux程序的完整路径?

我有这个要求,我需要从内部找到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++ linux

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

是否可以使用type_traits来区分char和wchar_t?

我试图编写一个函数,可以使用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?

c++ type-traits

6
推荐指数
1
解决办法
627
查看次数

从内存加载 CA 证书

我正在尝试从内存而不是文件中加载 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)

c++ boost openssl boost-asio

5
推荐指数
1
解决办法
3315
查看次数

无需迭代即可在两个地图中找到共同的价值

我有这两张地图,每张地图都存储着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)每次我从一个映射中删除一个条目时,都会从公用集中删除该密钥(如果存在)。

公用集始终维护两个映射中的键。当我想要加入时,我已经有了资格密钥。有更快/更好的方法吗?

c++ algorithm

3
推荐指数
1
解决办法
59
查看次数

通过引用C++线程传递局部变量

我正在审查一位初级同事的代码并遇到以下代码.

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++ c++11

0
推荐指数
1
解决办法
535
查看次数