2016-06-02 2 views
0

Я использую C++ 11. У меня есть класс Base и несколько производных классов для синтаксического разбора файлов конфигурации.CRTP и метод return void *

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).

+0

Какой тип вы действительно хотите вернуть 'get_data'? 'My_struct'? –

+1

CRTP - это класс. Производный: public Base ', а не какая-либо другая структура. Затем вы можете сделать функцию return 'T *'. –

+0

@MarkRansom, я хотел бы вернуть My_struct * в один из производных классов – ilya

ответ

1

Bro! Попробуйте переключиться на 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.

Смежные вопросы