我想尽可能地用标准C++中的等价物替换外部库(如boost),如果它们存在且可能,最小化依赖性,因此我想知道是否存在转换boost::system::error_code为安全的方法std::error_code.伪代码示例:
void func(const std::error_code & err)
{
if(err) {
//error
} else {
//success
}
}
boost::system::error_code boost_err = foo(); //foo() returns a boost::system::error_code
std::error_code std_err = magic_code_here; //convert boost_err to std::error_code here
func(std_err);
Run Code Online (Sandbox Code Playgroud)
最重要的不是完全相同的错误,只是尽可能接近,最后如果是错误.有智能解决方案吗?
提前致谢!
我正在尝试执行以下操作:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨:"错误C2665:'boost :: hash_value':17个重载中没有一个可以转换所有的参数类型".
但我已经定义了以下功能:
std::size_t hash_value(const boost::flyweight<std::string> & b)
{
boost::hash<std::string> hasher;
const std::string & str = b.get();
return hasher(str);
}
bool operator==(const boost::flyweight<std::string>& f, const boost::flyweight<std::string> & second)
{
return f.get() == second.get();
}
Run Code Online (Sandbox Code Playgroud)
但它没有编译.
我需要做些什么才能使boost unordered_map支持flyweight?
[编辑]我使用以下代码:
struct flyweight_hash
{
std::size_t operator()(const boost::flyweight<std::string> &elm) const
{
boost::hash<std::string> hasher;
const std::string & str = elm.get();
return hasher(str);
}
};
Run Code Online (Sandbox Code Playgroud)
并将其作为模板参数传递给地图的构造:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不明白重载hash_value没有工作的方式.
我设计了一个参数类,允许我编写如下代码:
//define parameter
typedef basic_config_param<std::string> name;
void test(config_param param) {
if(param.has<name>()) { //by name
cout << "Your name is: " << param.get<name>() << endl;
}
unsigned long & n = param<ref<unsigned long> >(); //by type
if(param.get<value<bool> >(true)) { //return true if not found
++n;
}
}
unsigned long num = 0;
test(( name("Special :-)"), ref<unsigned long>(num) )); //easy to add a number parameter
cout << "Number is: " << num; //prints 1
Run Code Online (Sandbox Code Playgroud)
类的性能非常快:一切都只是堆栈的引用.为了保存所有信息,我在使用最多5个参数的内部缓冲区进行堆分配之前减少每个对象的大小,但这很容易改变.
为什么这种语法不经常使用,重载operator,()以实现命名参数?是因为潜在的性能损失?
另一种方法是使用命名的习语:
object.name("my name").ref(num); //every …Run Code Online (Sandbox Code Playgroud) 我需要能够即时构建和销毁socket.io名称空间.很容易找到如何创建命名空间的信息,但我没有发现如何删除/断开命名空间以释放其内存.
假设我已经运行了以下代码:
var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected'):
});
nsp.emit('hi', 'everyone!');
Run Code Online (Sandbox Code Playgroud)
如何断开/删除上面创建的socket.io命名空间?
众所周知,UDP(用户数据报协议)是不安全的,因为与它一起发送的数据包的顺序可能无法按顺序传递,甚至根本不可能.但是,如果传送UDP数据包.实际意义上(99.99%及以上)的数据包中的信息是否保证是正确的?
在实际意义上(99.99%及以上),UDP数据包是否被保证完整(未损坏)?
提前致谢!
我正在尝试开发一个网站和相应的帮助程序(安装在用户计算机上).网站和程序将相互通信(主要是AJAX),但如果任何其他网页可以向程序发送请求,则存在很大的安全风险.我想提出一个解决方案,这使得向我的程序(安装在用户计算机上)注入欺诈请求非常困难.我的想法是使用一次性密码,但我的安全知识有限,因此请问您的想法.
我想出了这个一次性密码算法(伪):
function otp(seed, counter, unix_timestamp, action)
{
for(i = 0; i < counter; ++i)
{
seed = sha256(seed + i);
}
str = seed;
str = sha256(str + unix_timestamp/60);
str = sha256(str + action);
otp = substr(str,0,4); //Convert the first for bytes to an int.
return (int)otp;
}
Run Code Online (Sandbox Code Playgroud)
它应该具有以下属性:
如果每个请求都包含OTP代码和计数器值,这是否安全?如果没有,你有什么建议来完成这个?我真的想要上面提到的所有属性.
提前致谢.