小编Mat*_*owe的帖子

你如何使用xmllint的--pattern选项?

我试图看看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选项,以及它是如何工作的?

提供完整信用的示例.=)

xpath libxml2

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

如何使用XCode构建增强"入门"示例?

因此,假设您要构建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)

你做了以下事情:

  1. 使用./bjam install构建boost库
  2. 打开Xcode并创建一个新的C++命令行实用程序项目.
  3. 将libboost_regex.dylib拖到Groups&Files树视图的Products文件夹中(检查允许它复制文件的选项)
  4. 设置项目选项,以便Header Search Paths指向Boost包含文件夹
  5. 构建并运行项目!

遗憾的是,如果您打开控制台(运行|控制台),您将看到一个无法找到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!

但不要害怕.我知道问题是什么!如果没有人打败我,我会在午餐后发布解决方案.

regex xcode boost

7
推荐指数
1
解决办法
3719
查看次数

如何生成rdoc风格的可折叠代码段?

我正在使用Doxygen为C++项目创建内部文档.我有Doxygen包括方法的来源等,但这使得页面很难扫描.我希望它的行为类似于rdoc,并将源隐藏在默认情况下折叠的块中.

我认为这HTML_DYNAMIC_SECTIONS可能让我这样做,但唉,更改日志说该选项只会影响图表和图形.

也许我可以通过编辑来做到这一点LAYOUT_FILE

无论如何,聪明的人,我怎么能强迫Doxygen生成可折叠的代码段?

documentation doxygen rdoc

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

苹果,橙子和指向派生程度最高的c ++类的指针

假设我有一堆水果:

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)

c++ polymorphism inheritance multiple-dispatch visitor

5
推荐指数
2
解决办法
601
查看次数

为什么C++不允许您请求指向最派生类的指针?

(这个问题应该通过对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)

c++ inheritance multiple-dispatch rtti dynamic-dispatch

5
推荐指数
4
解决办法
588
查看次数

为什么WPF设计器无法加载调用非托管DLL的库?

我正在使用Visual Studio 2008,.NET 3.5 SP1,并拥有一个包含以下模块的测试应用程序:

  1. 一个C++ DLL
  2. 使用#1的C++/CLI DLL
  3. 使用#2的C#WPF应用程序

当我尝试使用#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设计者寻找动态库的地方有关.

c# wpf c++-cli visual-studio-2008

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

使用libxml2进行递归XPath查询的最有效方法是什么?

我为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根执行另一个查询?

c++ xpath libxml2

4
推荐指数
1
解决办法
1520
查看次数

负整数指数:它们是邪恶的吗?

我有这个我正在设计的数据库.

它需要包含几十个表,其中包含我们提供的记录(一组默认值)以及用户可以添加的记录.为了防止用户在脚中射击自己,有必要让他不要修改默认记录.

有很多方法可以促进这一点,但我喜欢给予受保护记录负整数索引的想法,同时保留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网格).

也许还有其他一些非常明显的原因会让这个想法变得非常糟糕.

那么最终的答案是什么呢?负整数指数是邪恶的吗?

sql indexing database-design

4
推荐指数
2
解决办法
2833
查看次数

在Visual Studio 2008中,是否有一个标识64位Windows操作系统的宏?

这是问题所在:

为了#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现在是操作系统的一部分,不可再发行.调查那个.

64-bit preprocessor visual-studio-2008

2
推荐指数
1
解决办法
6607
查看次数