CRTP и метод, возвращающий void *

Я использую 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 возвращаемыми значениями (как процедуры в Паскале).


person ilya    schedule 02.06.2016    source источник
comment
Какой тип вы на самом деле хотите, чтобы get_data возвращал? My_struct?   -  person Mark Ransom    schedule 02.06.2016
comment
CRTP — это class Derived: public Base<Derived>, а не какая-то другая структура. Затем вы можете заставить функцию возвращать T *.   -  person M.M    schedule 02.06.2016
comment
@MarkRansom, я хочу вернуть My_struct* в один из производных классов   -  person ilya    schedule 02.06.2016


Ответы (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;
 }
};

Этот фрагмент был взят из здесь.

person ilya    schedule 02.06.2016