从其他语言(如Java,Python,Perl,PHP等)调用C/C++的最佳方法是什么?
您可以将函数指针,函数对象(或boost lambda)传递给std :: sort,以定义要排序的容器元素的严格弱排序.
但是,有时候(足够我已经多次击中这个),你希望能够链接"原始"比较.
如果您正在排序表示联系人数据的对象集合,那么这将是一个简单的例子.有时你会想要排序
last name, first name, area code.其他时间
first name, last name- 还有其他时间
age, first name, area code......等
现在,您当然可以为每个案例编写一个额外的函数对象,但这违反了DRY原则 - 特别是如果每个比较都不那么简单.
好像你应该能够写的比较功能的层次 - 水平低的人做单,原始,比较(例如,名字<名字),然后更高层次的人打电话相继较低级别的人(可能与链接&&使用短路评估)来生成复合函数.
这种方法的问题在于std :: sort采用二元谓词 - 谓词只能返回一个bool.因此,如果您正在编写它们,则无法判断"假"是表示相等还是大于.你可以让你的下级谓词返回一个int,具有三种状态 - 但你必须包裹在那些更高级别的谓词,他们可以用的std ::对自己的排序在使用之前.
总之,这些并非不可克服的问题.它似乎比它应该更难 - 并且肯定会邀请一个帮助库实现.
因此,有没有人知道任何预先存在的库(特别是如果它是std或boost库)可以帮助到这里 - 对此事有任何其他想法?
[更新]
正如一些评论中提到的那样 - 我已经开始编写自己的类实现来管理它.它相当小,并且可能在一般情况下存在一些问题.但在此基础上,对于任何有兴趣的人,课程在这里:
一些辅助函数(以避免需要指定模板args)在这里:
假设我有以下界面,我想在我的服务器(常规Web服务)和我的客户端(silverlight 2.0应用程序)之间共享:
public interface ICustomerService
{
Customer GetCustomer(string name);
}
Run Code Online (Sandbox Code Playgroud)
我的Web服务实现了这个接口,并引用了一个Customer
定义了类型的类库.
通常,如果您想从WCF客户端(例如winforms应用程序)使用此服务,则可以共享模型程序集和服务合同接口.然后,通过使用a ChannelFactory
,您可以动态创建实现服务接口的代理.就像是:
ICustomerService myService = new ChannelFactory<ICustomerService>(myBinding, myEndpoint);
Customer customer = myService.GetCustomer("romain");
Run Code Online (Sandbox Code Playgroud)
我基本上想要做同样的事情,但是从Silverlight 2.0应用程序.银光ChannelFactory
似乎不像另一个......
你知道这是否可能?
注意:由于Silverlight应用程序只能引用Silverlight项目,因此我有:
两个版本的MyModel.dll包含Customer
类型:
两个版本的MyServicesContracts.dll包含ICustomerService
接口:
根据此页面,可以将其TClientDataset
用作内存数据集,完全独立于任何实际数据库或文件.它描述了如何设置数据集的表结构以及如何在运行时将数据加载到其中.但是当我试图遵循D2009中的指示时,步骤4(table.Open
)引发了异常.它说它没有指定提供者.
该页面上示例的整个要点是构建不需要提供程序的数据集.页面是错误的,它是否过时,或者我在某个地方错过了一步?如果页面错误,我需要使用什么来创建一个完全独立的内存数据集?我一直在使用TJvMemoryData
,但如果可能的话,我想减少我的数据集添加到项目中的额外依赖项的数量.
如何从侦听公共IP的反向代理后面正确地为位于私有LAN中的WCF Web服务提供WSDL?
我有一个以反向代理模式配置的Apache Web服务器,它侦听公共IP地址上的请求,并从内部IIS主机提供服务.WCF webservice使用LAN主机的FQDN地址生成WSDL,当然,互联网Web服务客户端无法读取该地址.
是否有任何设置可以在wcf应用程序的web.config或IIS中配置,以自定义生成的包含主机地址的WSDL并放置公共地址?
首先,我是Linq to Sql newbie,所以请温柔:).
我有过去3.5年开发的ASP.Net应用程序.它下面有相当大的数据模型,大约350个表.我正在尝试用Linq to SQL做一些新的东西.
第一印象是linq设计器和SqlMetal是为不大于NorthWind示例的数据库构建的.以下是我遇到的一些问题:
Products
很多地方需要的桌子(库存,发票,生产......).如果我Products
在每个dbml文件中放置表,linq设计器将在每个文件中创建Product
类.我不希望这样.我只想要一Product
堂课.现在,我真的很喜欢Linq,但我认为它仍然严重缺乏超过10桌的任何设计工具.
我现在的解决方案是使用Linq设计器构建较小的模型,然后手动合并它们(添加属性和引用),因此将生成大量代码,但也会有大量的手动工作.
我是否错过了一些重要的内容,或者这是与Linq对Sql的当前状态?
我希望计算API返回值所花费的时间.这种行动所花费的时间是纳秒秒.由于API是C++类/函数,我使用timer.h来计算相同的:
#include <ctime>
#include <cstdio>
using namespace std;
int main(int argc, char** argv) {
clock_t start;
double diff;
start = clock();
diff = ( std::clock() - start ) / (double)CLOCKS_PER_SEC;
cout<<"printf: "<< diff <<'\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了以秒为单位的时间.如何在毫秒秒内获得相同的精度?
我在显示带有嵌入式Unicode字符转义序列(\ uXXXX)的Javascript字符串时遇到问题,其中最初的"\"字符本身被转义为"\" 我需要做什么来转换字符串,以便正确评估转义序列并生成具有正确Unicode字符的输出?
例如,我正在处理输入,例如:
"this is a \u201ctest\u201d";
Run Code Online (Sandbox Code Playgroud)
试图解码"\" 使用正则表达式,例如:
var out = text.replace('/\/g','\');
Run Code Online (Sandbox Code Playgroud)
结果输出文本:
"this is a \u201ctest\u201d";
Run Code Online (Sandbox Code Playgroud)
也就是说,Unicode转义序列显示为实际转义序列,而不是我想要的双引号字符.
什么是Perl chomp
函数的Python等价物,如果它是换行符,它会删除字符串的最后一个字符?
现代(64位OS X和iPhone OS)Objective C运行时的一个特性是属性能够动态合成ivars而无需在类中明确声明它们:
@interface MyClass : NSObject {
// NSString *name; unnecessary on modern runtimes
}
@property (retain) NSStrng *name;
@end
@implementation MyClass
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
在我的相当多的代码中,我使用自定义getter实现来初始化属性:
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
Run Code Online (Sandbox Code Playgroud)
以上与合成的ivars不兼容,因为它需要访问未在标题中声明的ivar.由于各种原因,我想更新一些我的个人框架,以便在现代运行时构建时使用合成的ivars,需要修改上述代码以使用合成的ivars来实现该目标.
虽然Objective C 2.0文档指出现代运行时的合成访问器将在首次使用时合成ivar.它没有指定使用什么低级机制来执行此操作.它是由class_getInstanceVariable()完成的,对class_addIvar()的限制是否松散,是否是一个未记录的函数在客观的C 2.0运行时?虽然我可以为支持我的属性的数据实现自己的副存储,但我更愿意使用合成访问器正在使用的机制.