Я пытаюсь выяснить, как вообще перегрузить operator|()
для данного объекта базового класса для сериализации или цепочки вызовов функций, которые аналогичны тому, как работает pipes
или operator<<()
... Я хотел бы связать их через оператор канала. , Таким образом, я могу иметь ряд автономных функций и вызывать их для одного объекта данных... Другими словами, выполнять несколько преобразований одного и того же типа данных, как в потоковой системе...
Рассмотрим следующий пример псевдокода: этот код, вероятно, не скомпилируется, у меня нет под рукой моего компилятора, и я могу использовать неправильный синтаксис для указателей функций или объектов функций в качестве параметра в операторах... Это только чтобы проиллюстрировать образец и поведение, которое мне нужно.
template<typename T>
typedef T(*Func)(T); // Function Pointer for functors-lambdas-etc...
template<typename T>
struct pipe_object {
T operator|(T(*Func)(T) func) {
return func(T);
}
T operator()(T(*Func)(T) func) {
return this->operator|(t, func);
}
};
Тогда я мог бы использовать их примерно так:
constexpr int add_one_f(int x) {
return (x+1);
}
constexpr int add_two_f(int x) {
return (x+2);
}
void foo() {
pipe_object<int> p1 = {};
pipe_object<int> p2 = {};
int result = p1(&add_one) | p2(&add_two);
// or something like...
int result = p1 | p2; // ... etc ...
// or something like:
p1 = add_one | add_two | p2; // ... etc ...
}
Я просто не знаю, как распространять intput
- output
в операторе |()
... Придется ли мне перегружать две версии, чтобы он мог распознавать |(lhs, rhs)
, а также |(rhs, lhs)
?
Более того, что, если я захочу расширить это так, чтобы мои functors
или lambdas
принимали несколько аргументов...
Я выполнял поиск в Google по этому вопросу и нашел только пару ресурсов, но ничего конкретного, простого, элегантного и современного, по крайней мере, с функциями С++ 17...
Если вы знаете какие-либо хорошие исходные материалы по этому вопросу, пожалуйста, дайте мне знать!
result
должно быть в конце? Что вы добавляете один или два к? Какую роль должны игратьp1
иp2
? - person Igor Tandetnik   schedule 22.07.2020vec2 v2 = {3,5}
... тогда я хотел бы иметь возможность сделать что-то вроде:v2 = rotate(30) | scale(5) | translate(15);
тогда он повернет его на 30 градусов или радианы, увеличьте его на 5 единиц, а затем переведите на 15... Примерно так работаетlinux's pipes
... - person Francis Cugler   schedule 22.07.2020vec2
? Можете ли вы дать ему оператор присваивания, который будет принимать объект шаблон выражения, представляющий эту последовательность преобразований? - person Igor Tandetnik   schedule 22.07.2020Component
, в которой используется дизайнCRTP
, и это оператор, который я хотел бы добавить в базовый класс, чтобы все классы компонентов может использовать эту операцию изменяющимся образом... Оператор может жить вне класса и просто принимать объекты, или он может быть определен внутри... любой метод работает для меня... - person Francis Cugler   schedule 22.07.2020operator|()
перегрузке, конвейерной обработке, цепочке и т. Д. ... Мне придется изучитьexpression templates
... Теперь, есть ли какие-либо новые функции внутри С++ 17, который можно использовать, чтобы сделать это проще? У меня еще нет компилятора С++ 20 для использованияconcepts
,ranges
и т.д. - person Francis Cugler   schedule 22.07.2020Component
и из что у меня может быть 4 абстрактных типа, и каждый из них может иметь 3-10 вариантов... Когда вы начинаете шаблонизировать все, чтобы сделать код универсальным, это начинает немного сбивать с толку... - person Francis Cugler   schedule 22.07.2020opeator|()
, поскольку он редко перегружается ... Я не хочу использовать операторы<<
или>>
, так как я буду использовать их дляinput
иoutput
моего классы! И учитывая, чтоLinux
команды имеют технику передачи по конвейеру, я хотел имитировать это в своем исходном коде на С++, поскольку|
обычно используется для передачи по конвейеру или цепочки команд. - person Francis Cugler   schedule 23.07.2020int result = p1(&add_one) | p2(&add_two);
Какую операцию здесь должен выполнять|
? Кажется, никто не может понять, что вы хотите сделать с этими двумя целыми числами. - person Mooing Duck   schedule 23.07.2020vec2 v2{3,5}
Тогда, скажем, я хочу выполнить серию переводов для этого вектора ... Тогда у меня будет что-то вроде этого : `v2 | перевести(2.5) | вращать(30) | перевести(3) | шкала (2); Затем он переместит этот вектор на 2,5 единицы, повернет его на 30 градусов или радиан, затем переведет его на 3 единицы, а затем масштабирует на 2 в указанном порядке. Это последовательность операций, выполняемых над одним типом данных! Вектор был просто представлением... - person Francis Cugler   schedule 23.07.2020transform
иrotate
и тому подобное - person Mooing Duck   schedule 23.07.2020v2.translate(2.5); v2.rotate(30); v2.scale(10)
, я хочу использовать оператор|
для выполнения этих функций в этом канале данных в одной цепочке строк или передаче команд. - person Francis Cugler   schedule 23.07.2020predefined library
, это мой собственный проект, поэтому все мои классы мои собственные... У меня есть полный контроль над их реализацией и интерфейсами... Я просто хочу знать, как это сделать в общем, чтобы это может работать для любого из моих объектов без необходимости переписывать этот оператор для каждого класса.... - person Francis Cugler   schedule 23.07.2020