LINUX.ORG.RU

Можно, но это будет уже не перегрузка. Сделай внутри switch/case, обычный if или массив указателей на функции (вызывать примерно как fn_array[a](this)) - в зависимости от требований.

А лучше - напиши зачем тебе это надо. Возможно есть более правильный способ.

Deleted
()

Возьми нормальный язык с pattern matching'ом. Например на Haskell'е:

lala 0 = putStrLn "a = 0"
lala 1 = putStrLn "a = 1"

main = mapM_ lala [0,1]

imp ★★
()

#include <iostream>
template<int x> int f() { return x * x; }
template<> int f<3>() { return 0; }
int main() {
	std::cout << f<2>() << std::endl;
	std::cout << f<3>() << std::endl;
	return 0;
}

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

> Сделай внутри switch/case, обычный if

Так собственно этого избежать и хотелось :)

> А лучше - напиши зачем тебе это надо

Есть файл с данными, причем, данные могут быть в разном представлении (int, float, double и т.д.). Есть перегружаемая ф-ция, которая вычитывает эти данные. Сейчас я в эту ф-цию тип для перегрузки руками подставляю, зная о типе в файле. Так хотелось бы автоматизировать процесс: сделать в файле признак типа данных (например, 0 - int, 1 - float и т.д.) и ф-ция автоматом бы перегружалась, как-то так...

P.S. С разными типами ф-ция работает достаточно по-разному.

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

Или вообще абстрактный базовый класс обработки файлов и от него унаследовать обработчики для нужных типов. А получать обработчики от фабрики.

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

А возращаться она что будет? у нас статический язык все же

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

Какие, в бога-душу-патрега, switch/case? Массив функций использовать надо! Наибольшее приближение к тому, о чем говорит товарищ. Ну да, это не прямо средствами языка...

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

> Какие, в бога-душу-патрега, switch/case? Массив функций использовать надо! Наибольшее приближение к тому, о чем говорит товарищ. Ну да, это не прямо средствами языка...

Ну дак я тоже про массивЪ сказал.

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

А ещё фабрику выше правильно посоветовали...

Deleted
()

Выкинь C++

(defgeneric do-things (val &rest args))

(defmethod do-things ((val (eql 0)) &rest args) 
    (declare (ignore args))
    (do-nothing))

(defmethod do-things ((val (eql 1)) &rest args)
    (do-something args))

(defmethod do-things ((val (eql 2)) &rest args) 
    (do-another-thing args))

guest-3484-2009
()
Ответ на: комментарий от svu

>Эффективность и красота кода (взаимосвязанные характеристики, кстати)

В контексте С++ массив указателей на функции это скорее всего vtable.

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

>Ну vtable же напрямую не доступен, там по индексу не доберешься...

Тогда никакого "значения" вообще не нужно, нужно v->lala();

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

Ну да, тогда надо создавать разные v. Опять таки, можно в массиве. И получится, что v заводили только ради vtable c единственным элементом. Расточительно же!;)

svu ★★★★★
()

class Foo
{
public:
  enum HandlerType
  {
    HANDLER_1   = 0,
    HANDLER_2   = 1,
    HANDLER_CNT = 2

  };
  typedef void (Foo::* Handler)();
  typedef boost::array<Handler, HANDLER_CNT> Handlers;

  Foo()
  {
    handlers_[HANDLER_1] = &Foo::Handler1;
    handlers_[HANDLER_2] = &Foo::Handler2;
  }

  void SuperHandler(int a)
  {
    if(a>=HANDLER_1 && a<=HANDLER_2)
    {
      (this->*handlers_[a])();
    }
  }

private:
  void Handler1() {/**/}
  void Handler2() {/**/}

private:
  Handlers handlers_;
};


Foo foo;

foo.SuperHandler(Foo::HANDLER_2);

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

Что-то в плюсах не получается:

class A {

public:
A();
void lala(int a);
void lala(float a);
void (*f1)(int);

}

A::A() {
f1 = lala;
}

error: argument of type ‘void (A::)(int)’ does not match ‘void (*)(int)’

В общем, не совсем понятно, где и инициализировать указатель, и как
массив создать, ведь объявление указателя определяет адрес какой
ф-ции ему будет присвоен... Подскажите как лучше сделать.

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

>Ну да, тогда надо создавать разные v. Опять таки, можно в массиве. И получится, что v заводили только ради vtable c единственным элементом.

Ну "создание объекта" отличается от "использования объекта". Насколько я понимаю, в нормальном ООП код использующий объект по возможности не должен делать предположений на предмет того с какими объектами он работает - они должны приходить извне.

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

>В общем, не совсем понятно, где и инициализировать указатель, и как массив создать, ведь объявление указателя определяет адрес какой ф-ции ему будет присвоен... Подскажите как лучше сделать.

Указатель на метод бинарно не совместим с указателем на функцию. Вы точно правильно выбрали язык?

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

>Ну я в общем-то не давно с ++, чего не скрываю, а если можеш не писать лучше - не пиши.

Может начнешь все-таки с процедурного программирования? Просто необходимость "фабрик объектов" надо как-то осознать, а информация лучше усваивается в результате самостоятельного открытия этой информации.

Absurd ★★★
()

> Можно ли сделать так чтоб она перегружалась не по типу a, а по значению ? Например, если a == 0, то тело ф-ции одно, если == 1, то другое и т.д.

Александреску описывал шаблон Int2Type, который служит как раз для этого.

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

>Ну я в общем-то не давно с ++, чего не скрываю, а если можеш не писать лучше - не пиши.

вот и тебе лучше не писать! :)

ищи в гугле реализации массива функций.
с++ ты всё равно не знаешь на должном уровне, чтобы такие вещи самому реализовывать.
либо используй паттерны.
никто тебе здесь это велосипедный гемморой писать с нуля не будет!

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