Дилемма множественного наследования в C++

Я буду говорить за сторону Linux, по крайней мере, для категории программного обеспечения, я знаком с (который является оборудованием сбора данных РФ). Или промышленные приложения по сравнению с пользовательскими приложениями.

Windows CE (и его связанные инструменты) IMH довольно недавний E) сильно смещается к созданию "Windows Experience" на маленьком экране. Режим ввода данных пользователем подчеркивает мышеподобные действия. Входы в систему, выбор приложения, и т.д. вся попытка быть максимально подобным стандартному Windows.

, Если пользователь управляет погрузчиком или заполняет корзину выбора или движущийся материал от одного места до другого, существует проблема.

И это - движущаяся цель - особенно на стороне.NET. Компактное время выполнения.NET является и важными библиотеками с серьезными физическими недостатками (как сети, обработка данных и UI) являются неполными, и версии слишком часто удерживают от использования предыдущую версию.. CE, кажется, пасынок в семье Windows (возможно, потому что нет большого количества активной конкуренции, продающей аппаратным интеграторам.)

А хорошая стабильная консоль Linux строк-и-столбцов является довольно удобным контекстом для многих (по моему опыту, большинство) приложения высокого использования на привлекательном экране.

Не много пользы для игр на Вашем сотовом телефоне или Zune, все же.

ПРИМЕЧАНИЕ:

я думаю, что ctacke, вероятно, говорит точно за аппаратную сторону интегратора. Я больше выровненный плееров далее вниз канал - интеграторы программного обеспечения и пользователи.

5
задан Community 23 May 2017 в 12:19
поделиться

6 ответов

Взгляните на boost :: enable_if

// Before
template <class Stream>
some_type some_function(const Stream& c);

// After
template <class Stream>
boost::enable_if<
  boost::mpl::and_<
    boost::is_base_and_derived<Shareable,Stream>,
    boost::is_base_and_derived<Seekable,Stream>
  >,
  some_type
>
some_function(const Stream& c);

Благодаря SFINAE эта функция будет рассматриваться только в том случае, если Stream удовлетворяет требованию, т.е. Доступный и доступный

6
ответ дан 18 December 2019 в 08:29
поделиться

Возможно, вам понадобится шаблон декоратора .

0
ответ дан 18 December 2019 в 08:29
поделиться

Несколько мыслей:

STL имеет такую ​​же проблему с итераторами и функторами. Решение заключалось в том, чтобы все вместе удалить типы из уравнения, задокументировать требования (как «концепции») и использовать то, что составляет утиную типизацию. Это хорошо согласуется с политикой полиморфизма времени компиляции.

Возможно, промежуточным этапом было бы создание функции шаблона, которая статически проверяет свои условия при создании экземпляра. Вот скетч (который, я не гарантирую, будет скомпилирован).

class shareable {...};
class seekable {...};

template <typename StreamType>
void needs_sharable_and_seekable(const StreamType& stream)
{
    BOOST_STATIC_ASSERT(boost::is_base_and_derived<shareable, StreamType>::value);
    BOOST_STATIC_ASSERT(boost::is_base_and_derived<seekable, StreamType>::value);
    ....
}

Изменить: Потратил несколько минут на то, чтобы убедиться, что все скомпилировано, и «очистил» сообщения об ошибках:

#include <boost/type_traits/is_base_and_derived.hpp>
#include <boost/mpl/assert.hpp>

class shareable {};
class seekable {};

class both : public shareable, public seekable
{
};


template <typename StreamType>
void dosomething(const StreamType& dummy)
{
  BOOST_MPL_ASSERT_MSG((boost::is_base_and_derived<shareable, StreamType>::value),
                       dosomething_requires_shareable_stream, 
                       (StreamType));
  BOOST_MPL_ASSERT_MSG((boost::is_base_and_derived<seekable, StreamType>::value),
                       dosomething_requires_seekable_stream, 
                       (StreamType));
}

int main()
{
  both b;
  shareable s1;
  seekable s2;
  dosomething(b);
  dosomething(s1);
  dosomething(s2);
}
12
ответ дан 18 December 2019 в 08:29
поделиться

Как насчет использования шаблонного метода?

template <typename STREAM>
void doSomething(STREAM &stream)
{
  stream.share();
  stream.seek(...);
}
1
ответ дан 18 December 2019 в 08:29
поделиться

Предполагая, что оба Seekable и Shareable имеют общего предка, я могу придумать один способ принизить (конечно, assert s заменены на вашу проверку ошибок):

void foo(Stream *s) {
    assert(s != NULL);
    assert(dynamic_cast<Seekable*>(s) != NULL);
    assert(dynamic_cast<Shareable*>(s) != NULL);
}
0
ответ дан 18 December 2019 в 08:29
поделиться

Замените «разделяемый» и «ищущий» на «входящий» и «выходящий» и найдите свое решение «io». В библиотеке подобные проблемы должны иметь аналогичные решения.

0
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: