Могу ли я наследовать последовательность Boost.Fusion? - PullRequest
1 голос
/ 11 августа 2011

Можно / нужно ли мне наследовать от последовательности Fusion для реализации моего собственного класса последовательности? Если нет, то почему нет?

Например:

typedef boost::fusion::vector<
    std::vector<const char*>, 
    int, 
    double > MyVector;

class MyVectorWithData : public MyVector
{
public:
    MyVectorWithData(int i); // Constructor does some initialization
    // may be other member functions acting on baseclass MyVector
};

1 Ответ

1 голос
/ 11 августа 2011

Как и стандартные контейнеры, контейнеры Fusion не предоставляют виртуального деструктора, поэтому те же аргументы против их расширения сохраняются.

Кроме того, по моему опыту, метапрограммирование шаблонов и наследование не сочетаются друг с другом. Основная проблема заключается в том, что базовые классы не считаются для выбора специализаций шаблонов, что означает, что если некоторые метафункции специализированы для fusion::vector, вы не сможете использовать его с типом, производным от fusion::vector.

Если я правильно помню, Fusion использует диспетчеризацию тегов вместе с классами черт для выбора реализаций, так что это может быть проблемой. Я думаю, что класс свойств по умолчанию просто «пересылает» вложенную typedef, так что это может сработать, поскольку typedef будет наследоваться, но я не уверен, что это надежно (реализация может измениться).

Наконец, контейнеры Fusion не предоставляют никаких функций-членов (кроме тех, которые необходимы для построения и назначения), поэтому из них мало пользы. Если вы хотите, чтобы ваш класс был совместим с функциями Fusion (meta), вы должны использовать механизм расширения , предоставляемый библиотекой.

...