Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 00:07   #41
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

А если попытается, то на здоровье, зачем мешать человеку стрелять себе в ноги брать адрес переменной?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 06.02.2013, 00:59   #42
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Меня интересует вот такая вещь. Возможно ли это?

Код:
struct Some
{
   void Work(){}
   void Work(int){}
};

template<class F> void Test(T& func){}

....

int main()
{
  Test(&Some::Work); //ругнется, потому что неопределенность. 
//При выводе аргумента подойдут два типа указателей на функцию
}

Как можно разрешить ситуацию?

Предположим, в последствии я захочу запустить метод по указателю так:

Foo();

или так:

Foo(arg);


Соответственно, в момент запуска метода станет ясно какую именно перегрузку я имел ввиду.

Но заранее это не известно.

Более того, в последствии я могу захотеть запустить и так, и этак, и в зависимости от аргументов, коннектор должен автоматически переключатся на соответствующую перегрузку.

Такое вообще возможно?

/зы У меня уже есть готовый отлаженный механизм, который умеет нацеливаться на любые методы/функции, работать и лаунчер, и как функтор, но он не умеет работать с перегрузками.

Дизайн у него такой:

Connector con(имя_объекта, &класс::метод, аргументы_не_обязательно);
Connector con(&простая_функция, аргументы_не_обязательно);

В последствии, запустить функтор можно так:
Код:
con(); //для функций без аргументов, либо если аргументы были указаны при созданнии
con(аргументы); //чистый функтор
И хотелось бы, что бы в этот момент, коннектор сумел распознать по количеству и типам параметров, какую перегрузку нужно выбрать. А при инициализации можно задавать только имя

Последний раз редактировалось _Bers; 06.02.2013 в 01:02.
_Bers вне форума Ответить с цитированием
Старый 06.02.2013, 01:15   #43
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Соответственно, в момент запуска метода станет ясно какую именно перегрузку я имел ввиду.

Но заранее это не известно.
Если я ничего серьёзно не путаю, Some::Work(void) и Some::Work(int) имеют разные адреса. То есть, коннектор должен тогда уметь хранить не адрес, а список адресов, и всё равно ему нужно весь список передавать в конструктор.

А void Work(int arg=-1){} - не вариант?
Abstraction вне форума Ответить с цитированием
Старый 06.02.2013, 01:20   #44
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Если я ничего серьёзно не путаю, Some::Work(void) и Some::Work(int) имеют разные адреса. То есть, коннектор должен тогда уметь хранить не адрес, а список адресов, и всё равно ему нужно весь список передавать в конструктор.

А void Work(int arg=-1){} - не вариант?
Да нее, изюминка как раз в том, что бы разрешить перегрузку.

Я просто подумал, что коннектор в состоянии запомнить реальный тип объекта, на который нацелен.

Используя SFINAE может быть можно как нибудь разрулить эту тему
_Bers вне форума Ответить с цитированием
Старый 06.02.2013, 01:30   #45
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

на первый и второй взгляд, видимо, никак(Если, конечно, на заменить все перегружаемые функции на аналогичные функторы :D
Updated
SFINAE, наверное, да, должен как-нибудь да помочь
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 06.02.2013, 01:39   #46
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Я просто подумал, что коннектор в состоянии запомнить реальный тип объекта, на который нацелен.
Только если окончательный выбор адреса вызываемой функции будет сделан на этапе компиляции. Но решения, которое бы не налагало на Some дополнительных ограничений и работало как написано, мне в голову не приходит. Если можно потребовать, к примеру, что среди методов обязан быть void (Simple::*)(void)const, то ещё может быть способ.
Abstraction вне форума Ответить с цитированием
Старый 06.02.2013, 11:30   #47
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Результат все-таки удобнее записать в статическую константу, или, как советовал _Bers, в enum.
т.е примерно так:
Код:
template<typename T1>
struct is_class {
  template<typename T>
  constexpr static bool check(int T::*p) { return true; }
  template<typename T>
  constexpr static bool check(...) { return false; }
  
  enum { Value = is_class::check<T1>(0) };
};
Подскажи, это можно как-то правильнее записать? - мне вот не нравится что enum нельзя переместить в начало описания структуры, я думаю это не нормально.
rrrFer вне форума Ответить с цитированием
Старый 06.02.2013, 11:39   #48
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Подскажи, это можно как-то правильнее записать? - мне вот не нравится что enum нельзя переместить в начало описания структуры, я думаю это не нормально.
Всё тут нормально, чем Вам не нравится enum в конце?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 06.02.2013, 11:53   #49
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Забил заряд, я в тушку Пуго!
Или ушиб-ся?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.02.2013, 11:53   #50
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Всё тут нормально, чем Вам не нравится enum в конце?
да, вцелом, всем нравится, но я не вижу причины не быть ему в начале, а оно не работает )) Не подскажите в чем дело?
- мне кажется, что если я помещу enum в начало, то компилятор не сможет разобрать "is_class::check<T1>", т.к. до check он еще "не дошел", но я не уверен.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с чего начиНАТЬ С/С++!!!! dk118 Помощь студентам 0 05.12.2012 01:22
С чего начинать leonidsm Свободное общение 4 06.10.2012 19:37
Какой язык лучше всего выбрать после завершения изучения языка Паскаль. VektorAB Помощь студентам 4 09.07.2010 07:16
С чего начинать? Shadol Свободное общение 6 24.11.2009 11:46
С++ ЧЕГО НАЧИНАТЬ !!! geniy Общие вопросы C/C++ 12 03.09.2007 10:50