2016-03-21 34 views
2

bir duruma bir argüman geçemedi için if bildirimi. Yani, böyle yaptım: Ancak, benim yaklaşım kabul edilebilir nedeniyle bu fonksiyon beyanı bulunur

foo bar = get_bar_by_some_algorithm(); 
int a = 5,b = 6; 
do_somthing(a,b,bar.empty()?foo():bar); 

do_somthing eğer görünümün varsayılan argüman açısından stabil ama (? Iyi olduğunu bile) böyle bir şey değişirse:

void do_somthing(int a,int b,foo bar = get_special_foo()); 

foo(), get_special_foo() eşit olmadığından kodum eski olacaktır. Ben boş olması durumunda boş olmayan ve şey geçirilmesi DEĞİL durumunda bir argüman iletilmesi ? operatörü veya herhangi bir kısa eşdeğer nasıl kullanabilirim

soru nedir? açıklama (Hayali sözdizimi) için

Örnek: üçlü operatör ile

do_somthing(a,b,bar.empty()? the_default_argument : bar); 
+1

Hem üçlü operatör hem de bir şube yaparsa, BTW. – Jarod42

+1

Sadece 'bar' iletebilir ve 'if (bar.empty())' 'do_somthing' içinde kontrol edebilirsiniz. – CompuChip

+0

try boost :: isteğe bağlı – Thomas

cevap

2

Kişisel yaklaşım iyiydi, ama gereksiz gibiydi. Sonuçlara bakmaksızın daha sonraki bir tarihte işlevler için yeni varsayılan değerlere tokat atmak normal değildir. Varsayılan değeriniz anlamlı değilse, ilk etapta tasarımınızda bir sorun var demektir.

Sadece sizi eğlendirmek için, burada dalsız bir sürüm. Ilgi kaygısı dal sıkıntısı nedeniyle ölçülmüş bir darboğaz olsaydı ben böyle bir şey düşünebilirsiniz. o daha az belirgin olduğu için ben normalde bu yapmazdı basit if-ifadesi:

static auto do_something[2] = { 
    +[](int a, int b, foo bar) { do_something(a, b, bar); }, 
    +[](int a, int b, foo bar) { do_something(a, b); } 
}; 
do_something[bar.empty()](a, b, bar); 
+0

Tahmin atlamak için şube tahmini yapın. – Jarod42

+0

Hayır, çünkü derleyici lambda'yı bir işlev çağrısı için elemelidir, ki bu zaten olacaktı. Her durumda, sadece bir örneklemdi. – paddy

1

Kısa cevap bunun için ?: kullanamazsınız olmasıdır.

?: üçlü operatörünün belirtimi, üç işlenenin geçerli ifadeler olmasını gerektirir. Geçerli bir ifade (aşırı basit olarak), bir veya daha fazla değeri değerlendiren, (isteğe bağlı olarak) operatörleri kullanarak değerlere etki eden ve bir sonuç üreten bir yapıdır.

İçinde hiçbir şey olmayan bir ifade, bir çelişkidir: hiçbir şey değerlendirmez, bu nedenle ?: işlecinin işleneni olamaz.

Not: Boş bir ifadeye sahip olmanız mümkündür (örn. Izole edilmiş bir ;). Ancak boş bir ifade bir ifade değildir.

if() ürününü gizlemek için açık çözüm, CompuChip tarafından yorumlarda belirtildiği gibi, sınama işlevinizin içinde yapmak olacaktır. Veya sizin için sınama yapan bir sarıcı işlevi yazın (ve sarıcıdan ziyade doğrudan çağrılmasını önlemek için do_somthing()'un başka bir derleme biriminde bildirilmediğinden emin olun).