小编Kaz*_*ade的帖子

使用C++模板实现访问者模式

我一直在尝试通过使用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)

c++ templates visitor

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

Jasper Reports中的新行?

我刚刚开始使用Jasper Reports从使用Hibernate检索的数据生成报告.一切正常,除了JR似乎不尊重文本字段中的换行符(\n).有没有办法强制换行字符换行?

java newline jasper-reports line-breaks

12
推荐指数
4
解决办法
3万
查看次数

如何使C++(共享)库与clang和GCC兼容?

我写了一个相当庞大的C++ 11库,我打算允许从我的网站下载预编译版本.

所以我建立了一个自动构建,用clang编译库并使其可供下载,但这暴露了一个问题:如果我尝试使用GCC的clang编译库我得到未定义的引用(主要与之相关std::string) .我认为这与GCC 5.1中的GCC双ABI变化有关,但我不确定如何解决它.

我的问题是,我应该设置什么标志,或者我应该遵循哪些做法使C++库与clang和GCC兼容?

或者我应该放弃并编译两个独立的库?

c++ gcc c++11

11
推荐指数
1
解决办法
1255
查看次数

年份超出有效范围:1400 ... 10000

我正在尝试使用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"包含上述日期.我在格式字符串中犯了错误吗?

c++ datetime parsing boost

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

在Linux上定位字体(用C++编写)

我希望能够在给定字体名称(如果存在)时获取Linux上ttf字体文件的绝对路径.是否有返回该信息的命令或API?

例如,给定"arial.ttf"我想在任何地方找到绝对路径(例如/usr/share/fonts/truetype/msttcorefonts/arial.ttf).

c++ linux fonts truetype locate

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

在 Gtk+ (gtkmm) 中连接按键加速器

我一直在使用 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)

它在没有警告的情况下编译和运行,但键盘快捷键什么也不做。我一直在摆弄这个好几个小时,所以任何帮助或指导将不胜感激!

我做错了什么吗?为什么加速器不起作用?

c++ gtk keyboard-shortcuts gtkmm

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

像shared_ptr <T>这样的隐式转换

当使用std::shared_ptr<>它时shared_ptr<T>,shared_ptr<U>如果U是T的基础,则可以从中转换.

我正在尝试实现相同的目标,我有一个包装指针的模板类,我希望相同的派生到基础转换工作,这是怎么做的?

c++ templates casting

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

使用"Uncopyable"类时,会消除GCC警告

我有几个我不想复制的类,其中一些类有指针数据成员.为了使这些类不可复制,我私下继承了以下类模板:

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)

为什么它仍然给我这个警告?

c++ effective-c++

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