我一直在尝试通过使用C++模板来实现访问者模式来减少代码中的样板量.到目前为止,我已经想出了这个:
class BaseVisitor {
public:
virtual ~BaseVisitor() {}
};
template<typename T>
class Visitor : public BaseVisitor {
public:
virtual void visit(T& /* visitable */) = 0;
};
template<typename Derived>
class Visitable {
public:
void accept(Visitor<Derived>& visitor) {
visitor.visit(static_cast<Derived&>(*this));
}
};
Run Code Online (Sandbox Code Playgroud)
Visitable的每个子类都如下所示:
class Mesh : public Object, public Visitable<Mesh> {};
class Text : public Object, public Visitable<Text> {};
Run Code Online (Sandbox Code Playgroud)
最后,访客看起来像这样:
class Renderer : public Visitor<Mesh>, public Visitor<Text> {}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好......现在问题在于:
for(Scene::iterator it = scene.begin(); it != scene.end(); ++it) {
Object& object = static_cast<Object&>(*it); …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Jasper Reports从使用Hibernate检索的数据生成报告.一切正常,除了JR似乎不尊重文本字段中的换行符(\n).有没有办法强制换行字符换行?
我写了一个相当庞大的C++ 11库,我打算允许从我的网站下载预编译版本.
所以我建立了一个自动构建,用clang编译库并使其可供下载,但这暴露了一个问题:如果我尝试使用GCC的clang编译库我得到未定义的引用(主要与之相关std::string) .我认为这与GCC 5.1中的GCC双ABI变化有关,但我不确定如何解决它.
我的问题是,我应该设置什么标志,或者我应该遵循哪些做法使C++库与clang和GCC兼容?
或者我应该放弃并编译两个独立的库?
我正在尝试使用boost :: date_time将日期字符串(从Twitter API获取)解析为ptime对象.日期格式的一个示例是:
Thu Mar 24 16:12:42 +0000 2011
Run Code Online (Sandbox Code Playgroud)
不管我做了什么,在尝试解析字符串时,我得到"年份超出有效范围"异常.日期格式对我来说是正确的,这里是代码:
boost::posix_time::ptime created_time;
std::stringstream ss(created_string);
ss.exceptions(std::ios_base::failbit); //Turn on exceptions
ss.imbue(std::locale(ss.getloc(), new boost::posix_time::time_input_facet("%a %b %d %T %q %Y")));
ss >> created_time;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,"created_string"包含上述日期.我在格式字符串中犯了错误吗?
我希望能够在给定字体名称(如果存在)时获取Linux上ttf字体文件的绝对路径.是否有返回该信息的命令或API?
例如,给定"arial.ttf"我想在任何地方找到绝对路径(例如/usr/share/fonts/truetype/msttcorefonts/arial.ttf).
我一直在使用 gtkmm 编写 Gtk+ 应用程序,并且我正在尝试添加一个全局键盘快捷键来调用回调。不幸的是,gtkmm 中没有 Gtk::AccelGroup 的 connect() 方法,这显然是故意的,因为您可以使用 ActionGroups 进行连接...
无论如何,我有以下代码:
actions_= Gtk::ActionGroup::create();
actions_->set_accel_group(Gtk::AccelGroup::create());
actions_->add(
Gtk::Action::create("new"), Gtk::AccelKey("<control>n"),
sigc::mem_fun(this, &Window::new_buffer_thing)
);
_gtk_window().add_accel_group(actions_->get_accel_group());
Run Code Online (Sandbox Code Playgroud)
它在没有警告的情况下编译和运行,但键盘快捷键什么也不做。我一直在摆弄这个好几个小时,所以任何帮助或指导将不胜感激!
我做错了什么吗?为什么加速器不起作用?
当使用std::shared_ptr<>它时shared_ptr<T>,shared_ptr<U>如果U是T的基础,则可以从中转换.
我正在尝试实现相同的目标,我有一个包装指针的模板类,我希望相同的派生到基础转换工作,这是怎么做的?
我有几个我不想复制的类,其中一些类有指针数据成员.为了使这些类不可复制,我私下继承了以下类模板:
template <class T>
class Uncopyable
{
protected:
Uncopyable() {}
virtual ~Uncopyable() {}
private:
Uncopyable(const Uncopyable &);
T & operator=(const T&);
};
Run Code Online (Sandbox Code Playgroud)
我这样使用的是:
class Entity : private Uncopyable<Entity> { }
Run Code Online (Sandbox Code Playgroud)
这工作正常,但是当我使用-Weffc ++编译时,我仍然收到以下警告:
class Entity has pointer data members
but does not override Entity(const Entity&)
or operator=(const Entity&)
Run Code Online (Sandbox Code Playgroud)
为什么它仍然给我这个警告?