CRTP和方法返回void *

时间:2016-06-02 03:07:46

标签: c++ templates polymorphism crtp

我使用C ++ 11.我有一个Base类和几个派生类,用于逐行解析不同的配置文件。

template <class T>
class Base
{
public:
    virtual ~Base();
    bool load_from_file(const QString& str);
    virtual void* get_data(const QString& str) const  = 0;

private:
    QList<QSharedPointer<T> > items_;
};

每个后代(class Derived: public Base<My_struct>)必须提供get_data()实施 每个My_struct实例都包含来自设置文件某一行的信息。

例如,想象一下具有代理列表的典型文件 My_struct实例包含在Base方法的load_from_file()类中的智能指针中,并附加到items_成员。 load_from_file()方法在换行前将void*转换为T*

是否可以重新设计这些类,以避免使用void*(并且没有像boost::any这样的库)? 我的意思是考虑CRTP等。通常,CRTP示例包含具有void返回值的派生类的方法(如Pascal中的过程)。

1 个答案:

答案 0 :(得分:1)

兄弟!尝试切换到C ++ 14并使用以下代码段作为提示:

template <typename Derived>
struct base
{
 template <typename T>
 auto f(T x)
 {
  return static_cast<Derived&>(*this).f_impl(x);
 }

 auto g()
 {
  return static_cast<Derived&>(*this).g_impl();
 }
};

struct derived : base<derived>
{
 bool f_impl(int x)
 {
  return true;
 }

 double g_impl()
 {
  return 4.2;
 }
};

此片段取自here