จะส่งอาร์กิวเมนต์ที่เป็นทางเลือกไปยังเมธอดใน C ++ ได้อย่างไร?


112

จะส่งอาร์กิวเมนต์ทางเลือกไปยังเมธอดใน C ++ ได้อย่างไร? ข้อมูลโค้ดใด ๆ ...


9
คุณไม่ผ่านพารามิเตอร์ตัวเลือก คุณผ่านข้อโต้แย้งที่เป็นทางเลือก!
Chubsdad

สำหรับการควบคุมที่ชัดเจนมากกว่าที่มีให้โดยการสำรองค่า Sentinel ให้ตรวจสอบ boost :: optional <>
Tony Delroy

คำตอบ:


145

นี่คือตัวอย่างของโหมดการส่งผ่านเป็นพารามิเตอร์เสริม

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

คุณสามารถโทรหา myfunc ได้ทั้งสองวิธีและใช้ได้ทั้งคู่

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

กรุณาให้ตัวอย่างที่เกี่ยวข้องกับสตริงได้หรือไม่?
Swapnil Gupta

โมฆะ myfunc (int blah, โหมดถ่าน [] = NULL)
Pramendra Gupta

2
NULL0หมายถึงตัวชี้โมฆะแม้ว่ามันจะถูกกำหนดให้เป็นตัวอักษร ไม่ใช่ชื่อสากลสำหรับศูนย์คงที่ สำหรับจำนวนเต็ม (ไม่ใช่ตัวชี้) int mode = 0คุณควรใช้ตัวเลข:
UncleBens

1
หากคุณกำลังทำงานกับคลาส (ไฟล์ต้นทางและไฟล์ส่วนหัว) คุณจะกำหนดค่าเริ่มต้นไว้ที่ใด
AceFunk

3
@AceFunk Super ล่าช้า แต่รหัสที่ฉันเห็นมีค่าเริ่มต้นที่กำหนดไว้ในส่วนหัว หากคุณคิดเกี่ยวกับเรื่องนี้ระบบจะไม่ทราบว่าคุณสามารถละเว้นค่าได้หากกำหนดทางเลือกในแหล่งที่มา
อังคาร

50

กฎที่สำคัญเกี่ยวกับการใช้พารามิเตอร์เริ่มต้น:
ควรระบุพารามิเตอร์เริ่มต้นที่ด้านขวาสุดเมื่อคุณระบุพารามิเตอร์ค่าเริ่มต้นแล้วคุณจะไม่สามารถระบุพารามิเตอร์ที่ไม่ใช่ค่าเริ่มต้นได้อีก เช่น:

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 

@Chubsdad - อ่า.. คำพูดของฉันแย่มาก! คำสั่งที่สองสรุปถูกต้องหรือไม่? "เมื่อคุณระบุพารามิเตอร์ค่าเริ่มต้นคุณจะไม่สามารถระบุ parmeter ที่ไม่ใช่ค่าเริ่มต้นได้อีก"
บันทึก Alok

1
ดังนั้นหากฉันเข้าใจถูกต้องหากฉันมีพารามิเตอร์ทางเลือกหลายตัวฉันควรใช้พารามิเตอร์ทั้งหมดหรือไม่ใช้เลย? ฉันไม่สามารถเลือกใช้พารามิเตอร์ทางเลือก 1 พารามิเตอร์ แต่ไม่สามารถเลือกที่เหลือได้?
เจอราร์ด

@Gerard: ตัวอย่าง "อนุญาต" แสดงพารามิเตอร์ที่เป็นทางเลือกหนึ่งพารามิเตอร์ไม่ใช่กรณีการใช้งานที่เหลือซึ่งถูกต้อง
Alok Save

4
ฉันเข้าใจ แต่จะเป็นอย่างไรถ้าฉันมีint foo(int x, int y = 10, int z = 10)และต้องการโทรfoo(1,2)ดังนั้นจึงให้พารามิเตอร์ที่เป็นทางเลือกเพียงตัวเดียว ดูเหมือนฉันจะไม่สามารถทำให้มันทำงานได้ด้วยตัวเอง
เจอราร์ด

31

อาจเป็นเรื่องที่น่าสนใจสำหรับคุณบางคนในกรณีที่มีพารามิเตอร์เริ่มต้นหลายตัว:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

ให้การเรียกใช้ฟังก์ชันต่อไปนี้:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

มีการสร้างเอาต์พุตต่อไปนี้:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

อ้างอิง: http://www.learncpp.com/cpp-tutorial/77-default-parameters/


1
นี่คือสิ่งที่ฉันกำลังมองหา ใช้ฟังก์ชันเดียวที่สามารถจัดการอาร์กิวเมนต์ได้หลายแบบ ประกาศฟังก์ชันด้วยค่าเริ่มต้นในไฟล์ส่วนหัวจากนั้นกำหนดโดยไม่มีพารามิเตอร์เริ่มต้นจากนั้นคุณสามารถใช้งานได้ ไม่จำเป็นต้องทำหน้าที่มากเกินไป
Teh Sunn Liu

15

ใช้พารามิเตอร์เริ่มต้น

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

หมายเหตุ: สิ่งต่อไปนี้เป็นรูปแบบที่ไม่ดี

template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )

ขอบคุณสำหรับวิธีแก้ปัญหาทั่วไปฉันพยายามหาวิธีระบุค่าเริ่มต้นสำหรับประเภทใด ๆ โดยพลการ
ไม่ระบุชื่อ

14

ในการทำตามตัวอย่างที่ให้ไว้ที่นี่ แต่เพื่อชี้แจงไวยากรณ์ด้วยการใช้ไฟล์ส่วนหัวการประกาศฟังก์ชันไปข้างหน้าจะมีค่าดีฟอลต์ของพารามิเตอร์ที่เป็นทางเลือก

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

10

โดยใช้เครื่องหมายจุลภาคคั่นเช่นเดียวกับพารามิเตอร์ที่ไม่มีค่าเริ่มต้น

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2

9

โดยทั่วไปโดยการตั้งค่าเริ่มต้นสำหรับพารามิเตอร์:

int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}

8

ด้วยการแนะนำ std :: ทางเลือกใน C ++ 17 คุณสามารถส่งผ่านอาร์กิวเมนต์ที่เป็นทางเลือก:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

เอาท์พุต:

id=first param=<parameter not set>
id=second param=something

ดูhttps://en.cppreference.com/w/cpp/utility/optional

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.