我试图看看libxml如何实现XPath支持,所以我使用xmllint进行测试是有意义的.但是,显而易见的选项--pattern,有点模糊,我最终使用了类似下面的内容:
test.xml: <foo><bar/><bar/></foo>
> xmllint --shell test.xml
/ > dir /foo
ELEMENT foo
/ > dir /foo/*
ELEMENT bar
ELEMENT bar
Run Code Online (Sandbox Code Playgroud)
这似乎有效,这很好,但我仍然很好奇.什么是xmllint的--pattern选项,以及它是如何工作的?
提供完整信用的示例.=)
因此,假设您要构建Boost"Getting Started"示例并使用Xcode项目链接到它们,而不是在命令行中构建.你尝试只有标题的选项,它工作正常.
但是你接下来的例子来源:
#include <boost/regex.hpp>
#include <iostream>
#include <string>
int main()
{
std::string line;
boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );
while (std::cin)
{
std::getline(std::cin, line);
boost::smatch matches;
if (boost::regex_match(line, matches, pat))
std::cout << matches[2] << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
你做了以下事情:
遗憾的是,如果您打开控制台(运行|控制台),您将看到一个无法找到dylib的错误:
dyld: Library not loaded: libboost_regex.dylib
Referenced from: /Users/matt/Documents/Boost/test/GettingStarted/build/Debug/GettingStarted
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
因此,不知道让Xcode执行此操作的更好方法,您将dylib复制到your_project/build/debug /并运行!万岁!
你是细节导向的人,你在标准中键入一些东西来试试:
> Subject: foo bar baz
> foo bar baz
Run Code Online (Sandbox Code Playgroud)
然后是段错误.
Program received signal: “EXC_BAD_ACCESS”.
Run Code Online (Sandbox Code Playgroud)
ACK!
但不要害怕.我知道问题是什么!如果没有人打败我,我会在午餐后发布解决方案.
我正在使用Doxygen为C++项目创建内部文档.我有Doxygen包括方法的来源等,但这使得页面很难扫描.我希望它的行为类似于rdoc,并将源隐藏在默认情况下折叠的块中.
我认为这HTML_DYNAMIC_SECTIONS可能让我这样做,但唉,更改日志说该选项只会影响图表和图形.
也许我可以通过编辑来做到这一点LAYOUT_FILE?
无论如何,聪明的人,我怎么能强迫Doxygen生成可折叠的代码段?
假设我有一堆水果:
class Fruit { ... };
class Apple : public Fruit { ... };
class Orange: public Fruit { ... };
Run Code Online (Sandbox Code Playgroud)
以及在所述水果上运行的一些多态函数:
void Eat(Fruit* f, Pesticide* p) { ... }
void Eat(Apple* f, Pesticide* p) { ingest(f,p); }
void Eat(Orange* f, Pesticide* p) { peel(f,p); ingest(f,p); }
Run Code Online (Sandbox Code Playgroud)
好,等一下.停在那儿.请注意,任何理智的人都会使Eat()成为Fruit类的虚拟成员函数.但这不是一种选择,因为我不是一个理智的人.另外,我不想在我的水果类的头文件中使用Pesticide*.
遗憾的是,我希望接下来要做的就是成员函数和动态绑定允许的内容:
typedef list<Fruit*> Fruits;
Fruits fs;
...
for(Fruits::iterator i=fs.begin(), e=fs.end(); i!=e; ++i)
Eat(*i);
Run Code Online (Sandbox Code Playgroud)
显然,这里的问题是我们传递给Eat()的指针将是Fruit*,而不是Apple*或Orange*,因此什么都不会被吃掉,我们都会非常饥饿.
所以我真的希望能够做到而不是这样:
Eat(*i);
Run Code Online (Sandbox Code Playgroud)
这是:
Eat(MAGIC_CAST_TO_MOST_DERIVED_CLASS(*i));
Run Code Online (Sandbox Code Playgroud)
但是根据我有限的知识,这种魔法并不存在,除非可能是一个充满调用dynamic_cast的大讨厌if语句.
那么有一些我不知道的运行时魔法吗?或者我应该实现并维护一个充满dynamic_casts的令人讨厌的if语句?或者我应该把它搞砸,不要再考虑如何在Ruby中实现它,并允许一点Pesticide进入我的水果标题?
更新:而不是使用裸饮食功能和农药的人为设计,而是假设我只是不想把吃水果放在水果中,因为它毫无意义.知道怎么吃的水果?算了吧.相反,我需要一个带有Eat功能的Eater类,使用不同的代码来吃每种水果,以及一些默认代码,以防它是食者无法识别的水果:
class Eater
{
public:
void Eat(Apple* f) { wash(); nom(); …Run Code Online (Sandbox Code Playgroud) (这个问题应该通过对Stroustrup的引用来回答.)
能够请求指向最派生类的指针似乎非常有用,如下所示:
class Base { ... };
class DerivedA { ... };
class DerivedB { ... };
class Processor
{
public:
void Do(Base* b) {...}
void Do(DerivedA* d) {...}
void Do(DerivedB* d) {...}
};
list<Base*> things;
Processor p;
for(list<Base*>::iterator i=things.begin(), e=things.end(); i!=e; ++i)
{
p.Do(CAST_TO_MOST_DERIVED_CLASS(*i));
}
Run Code Online (Sandbox Code Playgroud)
但是c ++中没有提供这种机制.为什么?
更新,激励示例:
假设您没有Base和Derived and Processor,而是拥有:
class Fruit
class Apple : public Fruit
class Orange: public Fruit
class Eater
{
void Eat(Fruit* f) { ... }
void Eat(Apple* f) { Wash(f); ... }
void …Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio 2008,.NET 3.5 SP1,并拥有一个包含以下模块的测试应用程序:
当我尝试使用#2中的类作为WPF XAML中的资源时,设计师不会让我:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lib1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" <- ERROR
Run Code Online (Sandbox Code Playgroud)
错误是:"找不到程序集'ClassLibrary1'.确认您没有错过程序集引用.另外,请验证您的项目和所有引用的程序集是否已构建."
但是当我在应用程序主窗口的代码隐藏中使用C++/CLI DLL中的类时,一切正常.创建了Class1,并在其构造函数中调用C++ DLL,没问题.
using ClassLibrary1;
...
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
//use in code-behind
Class1 tmp = new Class1();
tmp.FirstName = "foo";
Title = tmp.FirstName;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我修改C++/CLI程序集,删除它对C++ DLL的调用并重建所有内容,设计器就会停止抱怨并加载C++/CLI程序集而不会抱怨.
我怀疑这个问题与WPF设计者寻找动态库的地方有关.
我为libxml2编写了一个C++包装器函数,这使我可以轻松地对XML文档进行查询:
bool XPathQuery(
const std::string& doc,
const std::string& query,
XPathResults& results);
Run Code Online (Sandbox Code Playgroud)
但我有一个问题:我需要能够对我的第一个查询的结果进行另一个XPath查询.
目前我通过将整个子文档存储在我的XPathResult对象中来完成此操作,然后将XPathResult.subdoc传递给XPathQuery函数.这非常低效.
所以我想知道... libxml2提供了什么能够轻松存储xpath查询的上下文(可能是对节点的引用?)然后使用该引用作为xpath根执行另一个查询?
我有这个我正在设计的数据库.
它需要包含几十个表,其中包含我们提供的记录(一组默认值)以及用户可以添加的记录.为了防止用户在脚中射击自己,有必要让他不要修改默认记录.
有很多方法可以促进这一点,但我喜欢给予受保护记录负整数索引的想法,同时保留0作为无效记录ID并给予用户记录正整数索引.
CREATE TABLE t1 (
ixt1 integer AUTOINCREMENT,
d1 double,
CONSTRAINT pk_ixt1 PRIMARY KEY (ixt1),
CONSTRAINT ch_zero CHECK (ixt1 <> 0)
);
-2 | 171.3 <- canned record
-1 | 100.0 <- canned record
1 | 666.6 <- user record
Run Code Online (Sandbox Code Playgroud)
原因似乎很好:
它不会占用更多的空间
这很容易理解
它不需要很多额外的表来实现
"select*from table"获取所有相关记录,没有额外的间接
固定记录可以向负方向增长,用户记录可以向正方向增长
但是,我对数据库设计比较陌生.在使用这个解决方案一段时间之后,我开始担心使用负面索引可能会很糟糕,因为
不同DBMS之间可能不一致地支持负索引,这使得编写与数据库无关的代码变得困难
通过在recid 0处插入一些东西来搞砸东西可能太容易了
它可能使得很难使用期望具有非负值的整数索引的工具(例如db网格).
也许还有其他一些非常明显的原因会让这个想法变得非常糟糕.
那么最终的答案是什么呢?负整数指数是邪恶的吗?
这是问题所在:
为了#imp为我的32位程序导入正确版本的ADO,我需要知道我是在32位Windows操作系统(意思是文件在Program Files中)还是在64位操作系统上编译(意思是该文件位于Program Files(x86)中.但我找不到一个宏告诉我这个,甚至一个宏告诉我处理器是64位.
当我在运行Visual Studio 2008 Express的64位Windows 7上测试时,定义了以下相关宏:
_M_IX86
X86
但是似乎没有定义任何*64宏,如果它们指的是/ target/architecture而不是当前机器的架构,我认为就是这种情况.
是否有预处理器宏告诉我是否运行64位Windows操作系统?
如果是这样,它是什么?我甚至会满足于告诉我是否使用64位处理器.
(ps我已经知道这个清单)
更新
到目前为止,人们似乎认为没有这样的宏,并且复制DLL或使用环境变量是更好的事情.
因此,考虑到环境变量提示,我通过将两个文件夹 - Program Files(x86)和Program Files - 放在include路径上并使用#import的尖括号语法解决了开发人员的问题.但是,我怀疑我需要为每个版本的操作系统构建发行版本,因为ADO DLL现在是操作系统的一部分,不可再发行.调查那个.