ฉันกำลังพยายามหาวิธีโอเวอร์โหลด 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 และพบแหล่งข้อมูลเพียงไม่กี่รายการ แต่ไม่มีสิ่งใดที่เป็นรูปธรรม เรียบง่าย หรูหรา และทันสมัยอย่างน้อยด้วยฟีเจอร์ C++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|()
overloading, Pipelining, Chaining ฯลฯ ... ฉันจะต้องดูที่expression templates
... ตอนนี้มีคุณสมบัติใหม่ภายในหรือไม่ c ++ 17 ที่สามารถใช้เพื่อทำให้สิ่งนี้ง่ายขึ้นได้อย่างไร ฉันยังไม่มีคอมไพเลอร์ C++20 เพื่อใช้concepts
,ranges
ฯลฯ - person Francis Cugler   schedule 22.07.2020Component
และจาก ซึ่งผมอาจมี abstract อยู่ 4 ประเภท และแต่ละประเภทสามารถมีได้ 3-10 รูปแบบ... พอคุณเริ่มสร้างเทมเพลตทุกอย่างเพื่อทำให้โค้ดทั่วไปเริ่มสับสนเล็กน้อย... - person Francis Cugler   schedule 22.07.2020opeator|()
เนื่องจากมันไม่ค่อยโอเวอร์โหลด ... ฉันไม่ต้องการใช้ตัวดำเนินการ<<
หรือ>>
เนื่องจากฉันจะใช้สำหรับinput
และoutput
ของฉัน ชั้นเรียน! และเมื่อพิจารณาว่าคำสั่งLinux
มีเทคนิคการไพพ์ ฉันจึงอยากเลียนแบบสิ่งนั้นในซอร์สโค้ด c++ ของฉัน เนื่องจาก|
มักใช้ในการไพพ์หรือการเชื่อมโยงคำสั่ง - 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