Saya mencoba mencari cara untuk membebani operator|()
secara umum untuk objek kelas dasar tertentu untuk membuat serial atau pemanggilan fungsi rantai yang mirip dengan cara kerja pipes
atau operator<<()
... Saya ingin menghubungkannya melalui operator pipa.. . Dengan cara ini saya dapat memiliki serangkaian fungsi mandiri, dan memanggilnya pada satu objek data... Dengan kata lain, untuk melakukan beberapa transformasi pada tipe data yang sama, seperti dalam sistem streaming...
Pertimbangkan contoh kode semu berikut: kode ini mungkin tidak dapat dikompilasi, saya tidak memiliki kompiler dan saya mungkin menggunakan sintaks yang salah untuk penunjuk fungsi atau objek fungsi sebagai parameter di operator... Ini hanya untuk mengilustrasikan pola dan perilaku yang saya kejar.
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);
}
};
Maka saya mungkin ingin menggunakannya seperti ini:
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 ...
}
Saya hanya tidak tahu cara menyebarkan intput
- output
di operator |()
... Apakah saya harus membebani dua versi secara berlebihan agar dapat mengenali |(lhs, rhs)
dan juga |(rhs, lhs)
?
Lebih dari itu, bagaimana jika saya ingin memperluas ini sehingga functors
atau lambdas
saya mengambil banyak argumen...
Saya telah melakukan pencarian Google tentang ini dan hanya menemukan beberapa sumber tetapi tidak ada yang konkret, sederhana, elegan, dan terkini setidaknya dengan fitur C++17...
Jika Anda mengetahui sumber materi yang bagus mengenai hal ini, harap beri tahu saya!
result
pada akhirnya? Apa yang Anda tambahkan satu atau dua ke? Peran apa yang seharusnya dimainkan olehp1
danp2
? - person Igor Tandetnik   schedule 22.07.2020vec2 v2 = {3,5}
... maka saya ingin dapat melakukan sesuatu seperti:v2 = rotate(30) | scale(5) | translate(15);
maka akan memutarnya 30 derajat atau radian, skalakan dengan 5 unit lalu terjemahkan dengan 15... Hampir seperti caralinux's pipes
bekerja... - person Francis Cugler   schedule 22.07.2020vec2
? Bisakah Anda memberinya operator penugasan yang akan menerima objek template ekspresi yang mewakili rangkaian transformasi ini? - person Igor Tandetnik   schedule 22.07.2020Component
yang menggunakan desainCRTP
dan ini adalah operator yang ingin saya tambahkan ke kelas dasar sehingga semua kelas komponen dapat menggunakan operasi ini dengan cara yang berubah... Operator dapat tinggal di luar kelas dan hanya mengambil objek atau dapat didefinisikan di dalam... metode mana pun yang berfungsi untuk saya... - person Francis Cugler   schedule 22.07.2020operator|()
kelebihan beban, pipelining, rangkaian, dll... Saya harus melihat keexpression templates
... Sekarang, apakah ada fitur baru di dalamnya c++17 yang dapat digunakan untuk mempermudah ini? Saya belum memiliki kompiler C++20 untuk menggunakanconcepts
,ranges
dll. - person Francis Cugler   schedule 22.07.2020Component
dan dari itu, saya mungkin memiliki 4 tipe abstrak, dan masing-masing dapat memiliki 3-10 varian... Saat itulah Anda mulai membuat template semuanya untuk membuat kode menjadi generik yang mulai sedikit membingungkan... - person Francis Cugler   schedule 22.07.2020opeator|()
karena jarang kelebihan beban... Saya tidak ingin menggunakan operator<<
atau>>
karena saya akan menggunakannya untukinput
danoutput
milik saya kelas! Dan mengingat perintahLinux
memiliki teknik perpipaan, saya ingin menirunya dalam kode sumber c++ saya karena|
biasanya digunakan untuk pemipaan atau rangkaian perintah. - person Francis Cugler   schedule 23.07.2020int result = p1(&add_one) | p2(&add_two);
Operasi apa yang harus dilakukan|
di sini? Sepertinya tidak ada yang bisa memahami apa yang ingin Anda lakukan dengan kedua bilangan bulat itu. - person Mooing Duck   schedule 23.07.2020vec2 v2{3,5}
Lalu katakanlah saya ingin melakukan serangkaian terjemahan pada vektor itu... Lalu saya akan memiliki sesuatu seperti ini : `v2 | terjemahkan(2.5) | putar(30) | terjemahkan(3) | skala(2); Kemudian ia akan menerjemahkan vektor tersebut sebanyak 2,5 satuan, memutarnya sebanyak 30 derajat atau radian, lalu menerjemahkannya sebanyak 3 satuan, lalu menskalakannya sebanyak 2 dalam urutan tersebut. Ini adalah urutan operasi yang dilakukan pada satu tipe data! Vektor hanyalah representasi... - person Francis Cugler   schedule 23.07.2020transform
danrotate
dan semacamnya - person Mooing Duck   schedule 23.07.2020v2.translate(2.5); v2.rotate(30); v2.scale(10)
Saya ingin menggunakan operator|
untuk melakukan fungsi-fungsi tersebut pada pipa data itu dalam satu baris yang merangkai atau menyalurkan perintah. - person Francis Cugler   schedule 23.07.2020predefined library
ini proyek saya sendiri jadi semua kelas saya adalah milik saya sendiri... Saya memiliki kendali penuh atas implementasi dan antarmukanya... Saya hanya ingin tahu cara melakukan ini secara umum sehingga dapat bekerja untuk objek mana pun saya tanpa harus menulis ulang operator ini untuk setiap kelas.... - person Francis Cugler   schedule 23.07.2020