我正在使用Gnome技术编写桌面应用程序,然后我开始计划语义桌面支持.
经过大量的头脑风暴,草拟想法和模型,写笔记和阅读大量有关RDF和相关主题的内容后,我终于想出了一份计划草案.
我决定做的第一件事是定义我给资源提供URI的方式,这是我想听听你的意见的地方.
我的计划由两部分组成:
1)在较低级别,定义了RDF模式.它是一组标准的类和属性,可能需要更多选项(使用转换为RDF的定义语言)的用户进行扩展.
2)在高级别,用户使用这些类和属性定义资源.
较低级别没有问题,因为数据模型是公开的:即使用户决定添加新内容,她也非常欢迎分享它并让其他人的应用程序具有更多功能.问题出在第二部分.在更高级别,用户定义任务,会议,约会,计划和日程安排.这些可能是私有的,并且用户可能更喜欢在URI中显示任何信息来揭示信息的来源.
以下是我的想法:
1)我应该使用哪种URI方案?我没有网站或任何网页,所以使用http没有意义.使用任何其他标准的IANA注册URI似乎也没有意义.我一直在考虑两个选项:为公共资源使用一些自定义的,我自己的URI方案名称,并为私有使用裸URN,如下所示:
urn : random_name_i_made_up : some_private_resource_uuid
Run Code Online (Sandbox Code Playgroud)
但我想知道自定义URI方案是否是一个好的决定,我很乐意听取你的意见:)
2)如何隐藏私人资源?一方面,URI可能非常有用,可以告诉任务来自何处,尤其是在人员之间共享和委派任务时.另一方面,它不考虑隐私.然后我想,我可以/我应该使用两种不同的URI样式,具体取决于用户设置吗?这会造成一些不一致.我不知道该怎么做,因为我没有任何URI经验.希望你对我有一些建议.
我有一个功能模板:
template <class ReportFunc>
void func (ReportFunc report_func)
{
for (/* ... */)
{
do_something (a, b);
report_func (a, b, c);
do_something_else (b, c);
}
}
Run Code Online (Sandbox Code Playgroud)
有时需要在没有任何ReportFunc的情况下调用func(),即循环只调用do_something()和do_something_else()而不是其他内容.如果我写了一个没有采用ReportFunc参数的f()重载,我将不得不复制f()的实现代码,只需删除调用report_func()的行.
我有几种这样的功能 - 有时我想用ReportFunc调用它们,有时候没有它.所以我想避免所有的代码重复.如果我传递一个空的lambda或void或类似的东西,它是否应该使C++ 11编译器生成f()的实例化,而不调用任何report_func()?它是否像删除调用report_func()的行一样快,甚至一个空的lambda都有一些开销,编译器没有优化?(在我的具体情况下,我使用GCC)
另外:如果一个空的lambda确实这样做,并且我将函数f()的返回类型更改为ReportFunc,即它返回report_func参数,是否仍然可以将返回值存储在变量中并调用它?(即使它是一个空的lambda?所以在理论上称它是可能的,它只是意味着什么都没有发生)
我有一个C++类模板.它采用模板参数类T并将类型为T的对象存储为可通过名为data()的方法访问的私有成员.下面的代码演示了它.我希望我的类模板提供一个方便的构造函数,它考虑了类型T.例如,一个构造函数,它将一些T的字段作为参数,并用它们的值初始化封装的T对象.
一种方法是让用户从模板实例化派生并在那里添加他们自己的构造函数,但我自然希望有一种方法来提供ctors而不会让用户编写派生类.
template <class T>
class Templ
{
public:
T& data();
const T& data() const;
private:
T obj;
};
Run Code Online (Sandbox Code Playgroud)
现在,如果用户想要一个Convenientve构造函数,他们必须派生Templ:
class MyClass : public Templ<MyData>
{
public:
MyClass (int size, MyClass* parent, float temperature, std::string name);
};
Run Code Online (Sandbox Code Playgroud)
我读了一些C++ 11的东西,并且有关于像STL这样的构造函数模板有std :: list :: emplace()方法集的想法,但我不确定什么是常见的最佳实践解决方案.
在我的代码中,有时我需要从另一个容器构造一个容器.但是这些容器对象的类型不同,所以我不能使用复制构造函数.我做的看起来像这样(C++ 11,我使用统一初始化和构造函数委托):
std::vector<int> source {1, 3, 5, 7, 9};
std::list<int> destination (source.begin (), source.end ());
Run Code Online (Sandbox Code Playgroud)
我意识到std :: list可以有这样的构造函数,以使事情变得更漂亮:
template </* ... */>
class list
{
public:
template <class Container> list (const Container& container)
: list (container.begin (), container.end ())
{
}
/* ... */
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,我只能为自己的课程而不是STL课程这样做.首先,问题是STL和Boost中不存在这样的协调器吗?第二个问题,是否有一种安全的方法来实现STL容器的这种ctor,可能是通过某种方式定义转换运算符?
这个问题当然只是为了方便,对代码或程序行为没有任何关键.但它可以使代码看起来更具可读性:
std::vector<int> source {1, 3, 5, 7, 9};
std::list<int> destination = source;
Run Code Online (Sandbox Code Playgroud) 调用迭代方法是否安全,例如STL容器擦除(覆盖2个迭代器),例如在我的情况下std::vector::erase(),两个参数都是vec.end()?我做了一个实验,看起来调用什么也没做,但我想确保我可以在代码中安全地使用它,否则我必须测试我的迭代器并避免erase()它们是相等的.