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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2014, 22:49   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Проблемы выравнивания адресов можно решить с помощью анонимного union.
А почему нельзя напрямую в Function_ref обяъвить указатель на функцию нужного типа?
Вроде _Ret(*pfn)(Args...)?
waleri вне форума Ответить с цитированием
Старый 26.08.2014, 23:33   #12
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

_Bers, спасибо.

Цитата:
Сообщение от waleri Посмотреть сообщение
Проблемы выравнивания адресов можно решить с помощью анонимного union.
А почему нельзя напрямую в Function_ref обяъвить указатель на функцию нужного типа?
Вроде _Ret(*pfn)(Args...)?
Лямбда в такой указатель откажется записываться, ведь она - похожа на экземпляр класса с оператором (). Это относится к лямбдам со списком захвата.

Моя задача в целом - передать лямду в виртуальную функцию и оттуда вызывать. Для решения задачи, функция могла бы быть шаблонной, но шаблонная функция не может быть виртуальной.
220Volt вне форума Ответить с цитированием
Старый 27.08.2014, 10:24   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

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

Шаблонная функция тоже может быть виртуальной, просто обычно в этом нет смысла.
waleri вне форума Ответить с цитированием
Старый 27.08.2014, 16:08   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Шаблонная функция тоже может быть виртуальной, просто обычно в этом нет смысла.
Нет. Не может. Это не возможно.

А вот смысл в этом есть: существуют обходные пути, позволяющие имитировать шаблоно-виртуальный метод. При этом утрачивается статический контроль за ошибками.
_Bers вне форума Ответить с цитированием
Старый 27.08.2014, 17:24   #15
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Можно сделать union с двумя указателями (лямбда и обычная функция) и два конструктора. Аргументы совпадают. Если у лямбды есть скрытый аргумент, как у методов класса, тогда не понятно откуда он берется в нынешней реализации.

Шаблонная функция тоже может быть виртуальной, просто обычно в этом нет смысла.
Не согласен, все это разные типы:
Код:
[i](){};
[&i](){};
[w, q](){};
Другими словами лямбда (со списком захвата) это:
Код:
class Lambda  // аналог первой лямбды из кода выше.
{
    int i;
public:
    Lambda(int i) : i{i} {}
    void operator()() {}
};
из-за этого и варьирует размер лямбды, на это оказывает влияние список захвата.

2. Не знаю как вы сюда виртуальность вкрутите:
Код:
struct Base
{
    template <typename T>
    virtual void fn(T t) = 0;
};
struct Child : Base
{
    template <typename T>
    void fn(T t) override {}
};
int main()
{
    Child c;
    Base *b = &c;
    b->fn(4);
    return 0;
}
Думаю можно попытаться через ручное инстанцирование, но как-то не красиво это.

Последний раз редактировалось 220Volt; 27.08.2014 в 17:35.
220Volt вне форума Ответить с цитированием
Старый 27.08.2014, 21:27   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Не согласен, все это разные типы:
Вызываются они одинаково, разве нет? Ну и даже если вызывать по разному, тогда можно сделать дополнительный указатель на метод-вызывальщик, в зависимости от типа а точный тип мы узнаем из конструктора. По мне так это наглядней, чем аж два вложенных класса.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как лучше хранить игровые данные CeHTuJI Общие вопросы Delphi 3 27.09.2013 15:15
Классы. Указатель на объект в классе. Son Помощь студентам 2 21.05.2013 18:45
Как хранить иерархические данные в реляционной бд? Хару Атари Помощь студентам 1 24.03.2013 17:46
Указатель на объект внутри класса WildTaburet Visual C++ 1 01.10.2012 14:34
где хранить данные принято? yuran111 Общие вопросы Delphi 36 12.05.2011 00:23