Sağlanan bir lambda'yı çağıran bir işlev sağlamaya çalışıyorum ve işlev void
döndürme türüne sahipse, varsayılan değeri döndürüp döndüremeyeceğini merak ediyorum. İşte C++ 11'deki dönüş değeriyle eşleşmenin herhangi bir yolu var mı?
void
ise, o zaman, 20.
#include <functional>
#include <iostream>
template <typename H>
auto f(H&& h) -> decltype(h(), void())
{
return h();
}
template <typename H>
auto f(H&& h) -> decltype(h(), int())
{
h();
return 20;
}
int main()
{
int r = f([](){ std::cout << "test1" << std::endl; return 10; }); // error here
std::cout << "r: " << r << std::endl;
r = f([](){ std::cout << "test2" << std::endl; });
std::cout << "r: " << r << std::endl;
return 0;
}
Bu hatayı üretir döndürür ne
test.cpp:20:68: error: call of overloaded ‘f(main()::<lambda()>)’ is ambiguous
Açıkçası bu, C++ 'nın dönüş türüne göre polimorfizm kullanamamasından kaynaklanmaktadır. Ancak, bu mümkün olabilir decltype
veya bazı şablon sihir daha iyi kullanımı gibi iyi C++ 11 hileler varsa merak ediyorum? Buraya kadar gerçek bir belirsizlik görmediği için soruyorum çünkü derleyici void
geri dönüş türünü çıkarıyor ve daha sonra biraz aptalca olan f
'un int
veya void
versiyonunu eşleştirmek için belirsiz olduğunu söylüyor.
Bunu yapmanın bir nedeni işlevi f
bir dönüş değeri bekler ancak kullanıcı bir return
deyimi içermeyen bir lambda sağlıyorsa, derleyici bir void
türü infers ve hatalar dışarı olmasıdır. Gerçek senaryoda, kullanıcı bir tane sağlamayı umursamadığında makul bir varsayılan getiri değerinin ne olması gerektiğine dair iyi bir fikrim olduğu için, derleyicinin kullanıcıların sıklıkla gereksiz olan return
bildirimini ihmal etmesine izin verilip verilmediğini merak ediyorum kolaylık için.
Teşekkürler. GCC 4.6.3 kullanıyorum bahsetmeliyim.
Cevap:
template <typename H>
auto f(H&& h) -> typename std::enable_if<std::is_same<decltype(h()), void>::value, int>::type
{
h();
return 20;
}
template <typename H>
auto f(H&& h) -> typename std::enable_if<std::is_same<decltype(h()), int>::value, int>::type
{
return h();
}
teşekkür: enable_if
kullanmanın xeo önerisine dayanarak, işe görünüyor aşağıdaki ile geldi!
normal fonksiyonlarına f test ettik aswell
çalışmalarını yapar? – CharlesB
Evet, normal fonksiyonlarda da belirsiz. – Steve
'decltype' ın ikinci parametresi: Ne için olduğunu sorabilir miyim? (Gerçekten, bilmiyorum çünkü). – 0x499602D2