假设您必须编写一种基于xml(无选择)的语言,最终将成为某种"标准"格式,被全球数十亿应用程序使用,或者至少您希望它. 该语言将类似于互联网的HTML,但在另一个特定的域中.一些非常简单和描述性的东西,将由工具和其他应用程序解释.
现在让我们说你对XML的工作方式有了基本的了解(你知道标签是如何工作的,它们可能有属性,元素中可能有元素......).你真的很了解这个领域,但你之前从未编写过语言或基于xml的格式规范(除了公司内部工具的一些基本xml格式).
你还需要知道什么才能正确地完成你的工作?也许某些XML语言特定的功能?也许使用XSD文件作为规范文件?
总结一下:在为这种语言设计和编写规范时,最佳做法是什么?
这个问题显然假设我们不想使用这种类型的模板(无论出于何种原因).
class Product
{
public:
Product( decltype(mPrice) price_, decltype(mLabel) label_ ) // 1.
: mPrice( price_ ), mLabel( label_ )
{}
decltype(mPrice) price() const {return mPrice;} // 2.
decltype(mLabel) label() const {return mLabel;} // 2.
private:
float mPrice ; // type might later be changed to more acurate floating point abstraction
std::string mLabel; // type might later be changed by a special localization-oriented string
};
Run Code Online (Sandbox Code Playgroud)
问题是:在C++ 0x中是1.和2.允许和可能(甚至是特定的)?
假设我有一个看起来像这样的类(实际上恰好是这个大小):
class K
{
public:
long long get_x() const; // lock m_mutex in shared/read-only mode
void update( long long w ); // lock m_mutex with a unique_lock
private:
long long m_a;
long long m_b;
long long m_c;
long long m_x;
double m_flow_factor;
mutable boost::shared_mutex m_mutex;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,这应该是线程安全的.update函数一次由一个线程调用,未知但只有一个线程(保证),但是访问者可以同时被多个线程调用.
更新功能正在更改所有值,并且经常被调用(每秒一次的hundread).正如您所猜测的,当前的实现将锁定很多.
我正在考虑使用std :: atomic来避免锁定,并可能使这段代码更有效.但是,我真的需要更新功能来一起更新值.因此,我正在考虑做这样的事情:
class K
{
public:
long long get_x() const
{ return data.load().x; }
void update( long long w )
{
auto data_now = data.load();
// ... work with data_now
data.store( …Run Code Online (Sandbox Code Playgroud) namespace O
{
class A{};
class A; // ok
typedef A K; // ok
struct A; // ok(C++11): A is a class but for references and pointer it have the same meaning
class K; // (1) error: K is a typedef (of a class...)
}
namespace U
{
typedef O::A A;
class A; // (2) error: A is a typedef (of a class...)
}
Run Code Online (Sandbox Code Playgroud)
标准C++不允许这些情况(1和2)编译的原因是什么?
我认为我很了解名字查找(在观看了几个关于它的视频并阅读了很多内容之后)但我只是遇到了这个案例:
#include <iostream>
namespace test{
struct Id
{};
void do_something( const Id& ){ std::cout << "Hello, World!" << std::endl; }
class Test
{
public:
void do_something() { std::cout << "WTF!" << std::endl; }
void run()
{
Id id;
do_something( id ); // doesn't compile
}
};
}
int main()
{
test::Test my_test;
my_test.run();
}
Run Code Online (Sandbox Code Playgroud)
指向的行不会编译(在GCC4.8和VC11U2上),因为它试图使用成员函数 test::Test::do_something()而不是命名空间作用域test::do_something( const Id& ),这似乎是唯一可能的候选者.
显然,成员函数名称隐藏了命名空间范围的名称,这对我来说是令人惊讶的,因为我记得在其他上下文中使用几乎相似的代码而没有产生此问题(但最终条件可能会非常不同).
我的问题是:这些编译器是否符合标准?
(不幸的是,通过阅读标准文档很难理解名称查找,所以我需要专家确认)
注意:我正在使用VS2013,因此可用的C++ 11功能有限.
我在重载模板函数时遇到问题,具体取决于参数类型是否可调用,理想情况下,参数是否与特定模式匹配.
这是我的代码的一个非常简化的示例,我的问题是如何实现update_callabe()重载:
template< class T, class... Args >
void update_callable( const std::vector<T>& objects, Args&&... args ); // 1: How to implement this?
template< class T, class... UpdateArgs>
class Controller
{ //...
virtual void update( T&, UpdateArgs... args ) = 0;
public:
template< class IterBegin, class IterEnd, class... Args >
void update_batch( IterBegin first, IterEnd last, Args&&... args )
{
std::for_each( first, last, [&]( T& object ){ update(object, args...); }
}
//...
};
template< class T, class... …Run Code Online (Sandbox Code Playgroud) (不确定它是否只是一个C++的东西)
异常处理在C++中很难学习,当然不是一个完美的解决方案,但在大多数情况下(除了一些特定的嵌入式软件环境),它肯定是我们目前用于异常处理的更好的解决方案.
未来怎么样?
是否有其他已知的方法来处理大多数语言中未实现的错误,或者只是大学研究?
换句话说:是否(通常)已知更好(不完美可行)的方法来处理编程语言中的错误?
c++ language-agnostic programming-languages exception-handling exception
我想找一个适合我当前项目的命名方案,但我认为我们应该聚集一些更有趣的方案来分享关于这个主题的知识和想法.
您还应该提供可能的名称与建议的方案或估计.
例如 :
版本的开发代号采用"形容词动物"的形式.例如:Warty Warthog(Ubuntu 4.10),Hoary Hedgehog(Ubuntu 5.04),Breezy Badger(Ubuntu 5.10),是Ubuntu的前三个版本.一般来说,人们使用形容词来表示发布,例如"warty"或"breezy".
这允许有限但非常大的可能名称计数.
对于我自己的项目,我正在考虑使用命名方案来命名公共版本,如流行的软件原则/哲学/规则/模式,如DRY,KISS,YAGNI,Singleton,Factory,Visitor等.但它感觉可能是一个太少了......电脑怪人.:)
我还没有用它来编写单元测试,我想在一个完整的小工具框架上做这个(使它更安全使用).这样,我肯定会学到更多关于单元测试的知识,而不是我到目前为止学到的东西.
然而,我真的习惯于系统地添加断言,我发现有一个上下文可以确定(在最终版本中被删除).主要是作为函数实现的前提条件,每次我检索必须正确的信息(比如着名示例的C/C++指针有效性).
现在我问:当你进行单元测试时,断言是多余的吗?因为当你测试一些代码的行为时它看起来很冗余; 但同时它与执行环境不同.
我应该两个都做吗?
我正在编写某种编辑器,我想允许用户在MdiArea中自由移动窗口并允许它们将窗口移出MdiArea,从应用程序的主窗口移出.
我该怎么做才能做到这一点?