LINUX.ORG.RU

Теперь попробуй объяснить ещё раз, что ты имеешь в виду и что хочешь в итоге получить

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

хочу передать в виртуальную функцию аргумент любого типа.
в С стиле использовал указатель на void. Говорят в С++, это плохо. я спрашиваю, как это сделать в с++ стиле

kasha
() автор топика

А причем тут вообще виртуальные функции? Ну и С++-way иметь несколько методов под каждый тип параметра. Или какой-нибудь boost::variant использовать.

anonymous
()

Шаблоны для виртуальных ф-й не катят.
мне нужна всего лишь одна абстрактная виртуальная функция. Где каждый наследник будет реализовывать свою версию, преобразовывая указатель на войд как ему нужно.Есть ли альтернативы в с++ стиле?

kasha
() автор топика
Ответ на: комментарий от kasha

Выбрось эту кашу из головы и расскажи нам, чего ты хочешь изначально. Без того, как ты это видишь.

anonymous
()
Ответ на: комментарий от kasha

Где каждый наследник будет реализовывать свою версию, преобразовывая указатель на войд как ему нужно

Возможно здесь где-то проблема в дизайне, если за войдом скрываются объекты некой иерархии классов, может лучше указатель на базовый класс всё же передавать (и применить Visitor, как вариант)

А так в целом надо смотреть на задачу и предметную область. Может у тебя там инты и даблы, а может объекты класса «дерево» и «автомобиль», и всё намешано.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Нет, объектов не будет. Мне нужно просто передать некие дополнительные параметры, а какие и какого типа неизвестно.

kasha
() автор топика

boost::any, QVariant, да тот же void* никто у тебя не отбирает. Но лучше все же расскажи для чего тебе это надо.

m0rph ★★★★★
()
Ответ на: комментарий от kasha

Нет, объектов не будет. Мне нужно просто передать некие дополнительные параметры, а какие и какого типа неизвестно.

Тогда void* - возможно, подходит (если лучше boost::variant, если клиенты-наследники к этому готовы).

yoghurt ★★★★★
()
Ответ на: комментарий от kasha

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

стоит заново обдумать интерфейс и использование такого абстрактного класса, а не бороться с системой типов.

Begemoth ★★★★★
()

Нет, ну а при чем тут виртуальная функция вообще?

asaw ★★★★★
()
Ответ на: комментарий от kasha

а какие и какого типа неизвестно.

если это не известно, то ты и вызвать такую функцию не сможешь.

Begemoth ★★★★★
()
Ответ на: комментарий от kasha

Кастани руками в воид*. Этих мест будет в ~100 раз меньше, чем слов в этом треде. А то и в 1000.

anonymous
()

Очередной госзаказ студенты пишут на плюсах?

anonymous
()
Ответ на: комментарий от kasha

Ты понимаешь, что так в статически типизированных языках не делают. Потому что это противоречит концепции статической типизации и реализуется только через небезопасные стремные костыли вроде «*void»?

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)

на c++ way

Тебе лучше на hui way.

anonymous
()
Ответ на: комментарий от kasha

Ух ты. Я так и знал что Windows 10 писали и переводили школьники и студенты младших курсов. Как ещё объясняется столько весёлых глюков?

peregrine ★★★★★
()
Ответ на: комментарий от kasha

И они тебе даже разрешают об этом заявлять? Совсем у них, наверное, плохи дела.

asaw ★★★★★
()
Ответ на: комментарий от kasha

Ну мы тут все люди серьезные и верим тебе, ведь это бизнес, а бизнес не терпит лжи и хвастовства.

anonymous
()
virtual void method(int arg, boost::any additional);
{
...
  MyConcreteType mct = boost::any_cast<MyConcreteType>(additional);
...
}

Но я подозреваю, что ты просто делаешь это неправильно и тебе вовсе не нужно стирание типа. Лучше расскажи, что конкретно должна делать эта функция.

anonymous
()
Ответ на: комментарий от anonymous

Но если типы, которые содержит additional известны, то лучше использовать boost::variant.

virtual void method(int arg, boost::variant<int, std::string, float> additional);
{
...
  float myFloat = boost::get<float>(additional); // Лучше почитать про boost::apply_visitor
...
}

anonymous
()
Ответ на: комментарий от kasha

Это просто тупо. Ответь мне на вопрос: Как работать с данными неизвестного типа?

anonymous
()
Ответ на: комментарий от kasha

А нахера они тебе там нужны без типа? Иди в JS тогда. анонiмус тебя ждет.

anonymous
()
Ответ на: комментарий от kasha

аргумент любого типа. указатель на void. Говорят в С++, это плохо.

нет, в таком случае так и делают. вопрос только, что вы с «любым типом» в этой функции делать собираетесь?

next_time ★★★★★
()
Ответ на: комментарий от kasha

Где каждый наследник будет реализовывать свою версию, преобразовывая указатель на войд как ему нужно

Вот поэтому программы на сях так часто и падают в корку - «разработчики» срут в указатели чем попало, а потом пыхтят по 9000 часов с gdb, удивляясь, чому оно не работает.

Нужны разные типы аргументов - юзай перегрузку.

cherry-pick
()

Какая в с++ есть замена void* для виртуальной функции?

Элементарно. Сначала выбрасываешь void*. А затем выбрасываешь и виртуальную функцию.

Например, нужно создать поток и в нём вызвать произвольную функцию и передать в неё произвольные данные:

#include <thread>

data d;
std::thread t{[d]{ std::cout << d; }};

Где: std::thread - поток, [d]{...} - функция, d - данные, переданные по значению.

rupert ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.