我不怕承认我是一个C++新手,所以这看起来像是一个愚蠢的问题,但......
我看到DWORD在代码示例中使用了所有地方.当我查看DWORD的真正含义时,它显然只是一个无符号整数(0到4,294,967,295).所以我的问题是,为什么我们有DWORD?它给了我们积分类型'unsigned int'不是什么?它与便携性和机器差异有关吗?
更新:经过一些额外的阅读后,我真正想要的是保证早期绑定(这应该转换为立即调用非虚函数和非PIC代码),这可以通过将(成员)函数作为模板参数传递来完成.我遇到的问题是gcc <4.5和icc 11.1可以为成员函数指针模板参数调用生成一些时髦的指令.AFAICT,gcc> = 4,5和vs2008处理这些模板参数调用很好.
首先,也许文字不是这个概念的正确术语,但它是我能想到的最接近的(不是作为一等公民的功能意义上的文字).
这个想法是,当你进行传统的函数调用时,它会编译成这样的东西:
callq <immediate address>
Run Code Online (Sandbox Code Playgroud)
但是如果使用函数指针进行函数调用,它将编译为如下所示:
mov <memory location>,%rax
callq *%rax
Run Code Online (Sandbox Code Playgroud)
这一切都很好.但是,如果我正在编写一个需要使用指定参数列表进行某种回调的模板库,并且该库的用户应该知道他们想要在编译时调用哪个函数呢?然后我想编写我的模板来接受函数文字作为模板参数.所以,类似于
template <int int_literal>
struct my_template {...};`
Run Code Online (Sandbox Code Playgroud)
我想写
template <func_literal_t func_literal>
struct my_template {...};
Run Code Online (Sandbox Code Playgroud)
并在my_template编译中调用func_literal callq <immediate address>
.
C++中是否有这样的设施,或者是为了达到同样的效果?如果没有,为什么不(例如一些灾难性的副作用)?C++ 0x或其他语言怎么样?
需要明确的是,通过可修改的连接视图,我指的是通过连接两个或多个表构建的视图,这些表允许插入/更新/删除操作来修改任何/所有组件表.
这可能是一个postgres特定的问题,不确定.我也感兴趣,如果其他DBMS具有可修改的连接视图的特殊功能,因为据我所知,它们在标准SQL中是不可能的.
我正在研究一个postgres模式,我最近的一些阅读建议可以使用rules(CREATE RULE ... DO INSTEAD ...
)构建可修改的连接视图.可修改的连接视图似乎是可取的,因为它允许在接口后面隐藏强规范化,提供经典抽象的机制.规则是实现的唯一选项,因为无法在视图上设置当前触发器.
然而,我试图设计的第一个可修改的视图遇到了问题,我发现许多人认为非平凡的规则是有害的(请参阅评论链接到这个SO答案).另外,我在网上找不到任何可修改的连接视图的例子.
问题(编辑以在问题上提出更好的观点):
非常感谢有关此主题的任何示例/讨论的链接.谢谢.
我正处于用于移动客户端 - 服务器通信的自定义tcp/ip协议的设计阶段.如果不需要(数据不敏感),我希望避免使用SSL出于开销原因(在握手延迟和保存周期中).
我的问题是,通过未加密的连接传输身份验证信息的最佳实践方法是什么?
目前,我喜欢SRP或J-PAKE(他们生成安全会话令牌,哈希/盐友好,并允许在必要时踢入TLS),我相信这两者都是在OpenSSL中实现的.但是,我有点小心,因为我没有看到很多人为此目的使用这些算法.也非常感谢指向任何讨论这个主题的材料,因为我找不到任何材料.
编辑
也许问题应该是:对于未加密的tcp/ip,是否存在安全密码的最佳实践方法?如果没有,选择特定方法的原因是什么?(到目前为止,鲁克斯的回答与这个问题的精神最接近,即使它确实违反了这封信).
编辑,部分deux
我主要对客户端 - 服务器身份验证的情况感兴趣,期望双方先验地拥有共享密钥(密码).
<更新>像我一样,问题是错误的.实际问题是:为什么transform_iterator不使用传统的result_of <>元函数来确定返回类型,而不是直接访问UnaryFunc :: result_type.通过解决方案发表答案. </更新>
具体来说,有没有办法让phoenix表达式暴露出result_type
std :: unary_function概念所期望的类型?boost :: transform_iterator似乎期待这个,并且通过查看它的src,我看不到简单的解决方法.
这里有一些代码可以重现我一直遇到的问题:
#include <boost/iterator/transform_iterator.hpp>
#include <boost/spirit/home/phoenix.hpp>
#include <numeric>
#include <iostream>
using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
int main(void){
int i[] = {4,2,5,3};
std::cout <<
std::accumulate(
boost::make_transform_iterator(i, _1*_1),
boost::make_transform_iterator(i+4, _1*_1),
0
) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译它的错误消息的相关部分是(gcc 4.3.4,boost 1.43):
/usr/include/boost/iterator/transform_iterator.hpp:43: error: no type named ‘result_type’ in ‘struct boost::phoenix::actor<...
Run Code Online (Sandbox Code Playgroud)
我对boost :: lambda(缺失result_type
)有同样的问题.我以为我过去看过make_transform_iterator和lambda的类似用法,现在我想知道我是不是想象它.
是否有一个提供的包装器或凤凰或lambda中的其他机制来暴露result_type
?
我正在尝试在视图上编写规则以从组件表中删除元组,但到目前为止只能从其中一个中删除数据.我已经使用了一段时间基本视图的postgres,但我对视图规则没有任何经验.
我写了一个愚蠢的小测试用例来弄清楚/显示我的问题.在这个例子中,每个子元组只有一个父元组(我的实际模式当然不是这样的).
组件表:
CREATE TABLE parent(
id serial PRIMARY KEY,
p_data integer NOT NULL UNIQUE
);
CREATE TABLE child(
id serial PRIMARY KEY,
parent_id integer NOT NULL UNIQUE REFERENCES parent(id),
c_data integer NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
视图:
CREATE TABLE child_view(
id integer,
p_data integer,
c_data integer
);
CREATE RULE "_RETURN" AS ON SELECT TO child_view DO INSTEAD
SELECT child.id, p_data, c_data
FROM parent JOIN child ON (parent_id=parent.id);
Run Code Online (Sandbox Code Playgroud)
问题删除规则
CREATE RULE child_delete AS ON DELETE TO child_view DO INSTEAD(
DELETE FROM child …
Run Code Online (Sandbox Code Playgroud) c++ ×3
postgresql ×2
assembly ×1
boost ×1
boost-lambda ×1
cryptography ×1
dword ×1
encryption ×1
generics ×1
passwords ×1
rules ×1
security ×1
sql ×1
tcp ×1
templates ×1
types ×1
winapi ×1