Взять адрес глобального оператора как указателя на функцию
От: Went  
Дата: 23.08.15 20:51
Оценка: -1
Здрасте. Снова я. Как получить указатель на оператор сложения двух интов, например?
std::function<int(int, int)> operator_plus = ... // Что тут написать?
Re: Взять адрес глобального оператора как указателя на функцию
От: Кодт Россия  
Дата: 23.08.15 21:24
Оценка: 4 (1) +1
Здравствуйте, Went, Вы писали:

W>Здрасте. Снова я. Как получить указатель на оператор сложения двух интов, например?


Казалось бы:
int (*intplus)(int,int) = [](int x, int y)->int { return x+y; };


Для арифметики нет интринсик-функций (у которых взять явно, хотя бы потому, что арифметические операторы для всех сочетаний числовых типов — это комбинаторный взрыв.
Перекуём баги на фичи!
Re: Взять адрес глобального оператора как указателя на функц
От: watchmaker  
Дата: 23.08.15 21:27
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

W>Здрасте. Снова я. Как получить указатель на оператор сложения двух интов, например?

Никак. Нет у такого оператора адреса и нет функции, реализующей его. Если нужна, то либо напиши свою и бери её адрес, либо возьми готовую обёртку std::plus<int>, либо сделай по аналогии с std::accumulate.
Отредактировано 24.08.2015 0:41 watchmaker . Предыдущая версия .
Re: Взять адрес глобального оператора как указателя на функцию
От: Кодт Россия  
Дата: 23.08.15 21:42
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

<>

Для переиспользования кода можно сделать такой шаблон
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: Взять адрес глобального оператора как указателя на функцию
От: Went  
Дата: 24.08.15 06:37
Оценка:
Здравствуйте.
Во дела. Я понимаю, что такие "встроенные" операторы не существуют в виде функций. Но думал, компилятор будет создавать требуемую по каждому запросу с явным указанием параметров.
Re[2]: Взять адрес глобального оператора как указателя на функц
От: Went  
Дата: 24.08.15 06:48
Оценка:
Здравствуйте, watchmaker, Вы писали:
W>либо возьми готовую обёртку std::plus<int>
Щи! operator() у этих оберток не статический. Зрада!
Re: Взять адрес глобального оператора как указателя на функцию
От: VTT http://vtt.to
Дата: 24.08.15 07:04
Оценка: +1
Здравствуйте, Went, Вы писали:

W>Здрасте. Снова я. Как получить указатель на оператор сложения двух интов, например?

W>
W>std::function<int(int, int)> operator_plus = ... // Что тут написать?
W>


Ну я бы разделил этот вопрос на два:
1) Как взять адрес глобального оператора как указателя на функцию?
Это делается тривиальным образом:
typedef void * (*t_Method)(size_t);
t_Method method(&::operator new);

2) Как взять адрес глобального оператора для встроенных типов, сложения двух интов например?
Никак, таких глобальных операторов нет, предопределенные операции со встроенными типами тоже встроенные. В этом случае не обойтись без дополнительной обертки.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[3]: Взять адрес глобального оператора как указателя на функц
От: Кодт Россия  
Дата: 24.08.15 10:16
Оценка:
Здравствуйте, Went, Вы писали:

W>>либо возьми готовую обёртку std::plus<int>

W>Щи! operator() у этих оберток не статический. Зрада!

А тебе смотря для чего. Эта обёртка прекрасно инлайнится.
Единственно, что меня берут сомнения — хватит у компилятора оптимизировать std::function, чтобы он не тащил в неё копию объекта.
Перекуём баги на фичи!
Re[4]: Взять адрес глобального оператора как указателя на функц
От: Went  
Дата: 24.08.15 10:52
Оценка:
Здравствуйте, Кодт, Вы писали:
К>А тебе смотря для чего. Эта обёртка прекрасно инлайнится.
Да мне нужен оператор сложения как свободная функция, коей он и является. Короче, иду за водопроводными трубами для своего велосипеда.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.