我想要简单的基于C++字符串的模板库来在运行时替换字符串.
例如,我会用
string template = "My name is {{name}}";
Run Code Online (Sandbox Code Playgroud)
在运行时,我希望根据实际名称更改名称.
我找到了一个例子,www.stringtemplate.org但是当我谈到antlr等时我有点害怕.
我有类型的Rock
,Paper
和Scissors
.这些是Rock,Paper,Scissors游戏的组件或"手".鉴于两名球员的手,比赛必须决定谁获胜.如何解决存储此链表的问题
没有将各种手相互耦合?目标是允许在游戏中添加新手(例如Jon Skeet)而不更改任何其他游戏.
我对代理的任何想法持开放态度,但不对大型switch语句或代码重复持开放态度.例如,引入一个管理链的比较的新类型是好的,只要我不需要为我添加的每个新手更改它.再说一遍,如果你可以合理地拥有一个必须为每一个新手或一只手改变的代理,那也是受欢迎的.
这是一个设计101问题,但我很好奇人们可以为此提出什么解决方案.显然,这个问题很容易扩展到更大的系统,有更多的组件,它们之间有任意复杂的关系.这就是为什么我要提出一个非常简单而具体的例子来解决.任何使用的范例,OOP或其他方式都是受欢迎的.
我正在攻击的一个简单的骨架实用程序的一部分我有一个语法来触发文本中的替换.我认为这是一种很好的方式来适应Boost.Spirit,但模板错误是一种独特的喜悦.
以下是完整的代码:
#include <iostream>
#include <iterator>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace bsq = boost::spirit::qi;
namespace {
template<typename Iterator>
struct skel_grammar : public bsq::grammar<Iterator> {
skel_grammar();
private:
bsq::rule<Iterator> macro_b;
bsq::rule<Iterator> macro_e;
bsq::rule<Iterator, bsq::ascii::space_type> id;
bsq::rule<Iterator> macro;
bsq::rule<Iterator> text;
bsq::rule<Iterator> start;
};
template<typename Iterator>
skel_grammar<Iterator>::skel_grammar() : skel_grammar::base_type(start)
{
text = bsq::no_skip[+(bsq::char_ - macro_b)[bsq::_val += bsq::_1]];
macro_b = bsq::lit("<<");
macro_e = bsq::lit(">>");
macro %= macro_b >> id >> macro_e;
id %= -(bsq::ascii::alpha | bsq::char_('_'))
>> +(bsq::ascii::alnum | bsq::char_('_'));
start = *(text | macro); …
Run Code Online (Sandbox Code Playgroud) std::sort(range(c));
Run Code Online (Sandbox Code Playgroud)
而不是
std::sort(c.begin(), c.end();
Run Code Online (Sandbox Code Playgroud)
您是否期望下一个标准为标准算法提供范围过载?
Boost的范围迭代器是类似的,iseq()
在TC++ PL3e中提到的Bjarne Stroustrup 也是同样的想法.我查看了我能找到的最新草案,但没有看到提到的范围超载.
假设我构造了一个RAII对象,并且该对象可能无法构造.我该如何处理?
try {
std::vector<int> v(LOTS);
// try scope ends here because that's what the catch is for
} catch( const std::bad_alloc& ) {
// ...
}
// v? what v?
Run Code Online (Sandbox Code Playgroud)
当然,默认构造函数std::vector
不会抛出,这可能有所帮助,但这不是一般情况.一个构造函数可能会抛出.如果我想处理任何资源获取失败,如果它没有抛出,我怎么能这样做仍然能够继续?
编辑:为了澄清,我的问题是,如果资源无法获取,那么我可能想再试一次,依此类推.也许我可以尝试获取替代资源.
在Ruby中,为什么定义一个类进行求值nil
?定义方法也是如此:为什么要评估nil
?如果定义一个类会被评估为类,那会不会有用?
我会使用像这样的单身人士:
Singleton* single = Singleton::instance();
single->do_it();
Run Code Online (Sandbox Code Playgroud)
我会使用这样一个未命名的类:
single.do_it();
Run Code Online (Sandbox Code Playgroud)
我觉得Singleton模式除了具有可读错误消息之外没有优于未命名类的优势.使用单例比使用未命名的类对象更笨拙:首先,客户端必须首先获得实例的句柄; 第二,Singleton::instance()
可能需要考虑并发的实现者.
那么为什么以及如何选择一个单身人士而不是一个未命名的班级呢?
作为附录,虽然明确定义了一个未命名的类可能是
class {
// ...
}single;
Run Code Online (Sandbox Code Playgroud)
我可以这样定义它:
#ifndef NDEBUG
class Singleton__ { // readable error messages,
#else
class { // unnamed, clients can't instantiate
#endif
// ...
}single;
Run Code Online (Sandbox Code Playgroud)
后一种方法具有可读编译器错误消息的优点,但在调试模式下不是单例.
是f()
异常安全的调用吗?
inline std::auto_ptr<C> auto_new() {
return std::auto_ptr<C>(new C());
}
void f(std::auto_ptr<C> p1,
std::auto_ptr<C> p2);
// ...
{
f(auto_new(), auto_new());
}
Run Code Online (Sandbox Code Playgroud)
换句话说,auto_new()
如果两个函数是内联的,那么当涉及到第一个和第二个函数调用的原子性时,它会有什么不同吗?
我有问题要求'digest/sha1'
.
~$ ./configure --prefix=$HOME/usr --program-suffix=19 --enable-shared
~$ make
~$ make install
~$ irb19
irb(main):001:0> require 'digest/sha1'
LoadError: dlopen(/Users/matan/usr/lib/ruby19/1.9.1/i386-darwin9.8.0/digest/sha1.bundle, 9): Symbol not found: _rb_Digest_SHA1_Finish
Referenced from: /Users/matan/usr/lib/ruby19/1.9.1/i386-darwin9.8.0/digest/sha1.bundle
Expected in: flat namespace
- /Users/matan/usr/lib/ruby19/1.9.1/i386-darwin9.8.0/digest/sha1.bundle
from (irb):1:in `require'
from (irb):1
from /Users/matan/usr/bin/irb19:12:in `<main>'
irb(main):002:0>
Run Code Online (Sandbox Code Playgroud)
我知道一些标准模块需要很好,而其他标准模块则不需要.如果我说require 'yaml'
或甚至require 'digest'
那时候工作正常.我使用的是OS X 10.5.8,Ruby 1.9.1-p378.系统范围的Ruby 1.8.6安装工作正常.
就在上周,我卸载了Ruby并重新安装了它.当我第一次安装Ruby时,我以类似的方式从我的本地$HOME/usr
目录前缀的源代码安装它.我尝试删除每个文件make install
安装,然后重新安装,但这没有帮助.
您是否知道问题是什么以及如何解决?
void add(int register, int& acc)
{
acc += register;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp:124:错误:'register'之前的预期primary-expression
那边有错吗?
#define PLAINTEXT_TARGET "plaintext"
if( strstr(PLAINTEXT_TARGET, optarg) == PLAINTEXT_TARGET )
/* ... */
Run Code Online (Sandbox Code Playgroud)
C语言是否保证PLAINTEXT_TARGET
以上编译成单个实例?如果编译器可能产生宏字符串的两个实例,那么上面的条件是误导性的并且可以是假的.
例如,如果我做这样的事情:
vector<int> myvector;
myvector.push_back(100);
int * ptr = &(myvector[0]);
myvector.clear();
myvector.push_back(10);
Run Code Online (Sandbox Code Playgroud)
ptr仍然有效吗?或者它现在可能指向垃圾?
示例:
输入:5 4 2 1 10
输出:Median = 4