Здравствуйте, Went, Вы писали:
W>Здрасте. Снова я. Как получить указатель на оператор сложения двух интов, например?
Казалось бы:
int (*intplus)(int,int) = [](int x, int y)->int { return x+y; };
Для арифметики нет интринсик-функций (у которых взять явно, хотя бы потому, что арифметические операторы для всех сочетаний числовых типов — это комбинаторный взрыв.
Перекуём баги на фичи!
Re: Взять адрес глобального оператора как указателя на функц
Здравствуйте, Went, Вы писали:
W>Здрасте. Снова я. Как получить указатель на оператор сложения двух интов, например?
Никак. Нет у такого оператора адреса и нет функции, реализующей его. Если нужна, то либо напиши свою и бери её адрес, либо возьми готовую обёртку std::plus<int>, либо сделай по аналогии с std::accumulate.
Для переиспользования кода можно сделать такой шаблон
template<class X, class Y> struct operators {
static auto plus (X x, Y y) { return x+y; }
static auto minus(X x, Y y) { return x-y; }
// и так далее, для всех известных операторов
};
auto f = operators<float, char>::plus; // указатель на функцию, возвращающую double
std::function<char(long, short)> g = f; // поверх функции нахлобучены санки, преобразующие типы туда и оттуда
Перекуём баги на фичи!
Re: Взять адрес глобального оператора как указателя на функцию
Здравствуйте.
Во дела. Я понимаю, что такие "встроенные" операторы не существуют в виде функций. Но думал, компилятор будет создавать требуемую по каждому запросу с явным указанием параметров.
Re[2]: Взять адрес глобального оператора как указателя на функц
2) Как взять адрес глобального оператора для встроенных типов, сложения двух интов например?
Никак, таких глобальных операторов нет, предопределенные операции со встроенными типами тоже встроенные. В этом случае не обойтись без дополнительной обертки.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[3]: Взять адрес глобального оператора как указателя на функц
Здравствуйте, Went, Вы писали:
W>>либо возьми готовую обёртку std::plus<int> W>Щи! operator() у этих оберток не статический. Зрада!
А тебе смотря для чего. Эта обёртка прекрасно инлайнится.
Единственно, что меня берут сомнения — хватит у компилятора оптимизировать std::function, чтобы он не тащил в неё копию объекта.
Перекуём баги на фичи!
Re[4]: Взять адрес глобального оператора как указателя на функц
Здравствуйте, Кодт, Вы писали: К>А тебе смотря для чего. Эта обёртка прекрасно инлайнится.
Да мне нужен оператор сложения как свободная функция, коей он и является. Короче, иду за водопроводными трубами для своего велосипеда.