Özel akış denetleyicilerinin daha kolay oluşturulmasını sağlamak için C++ 11 özelliklerini kullanmaya çalışıyorum. Lambda fonksiyonlarını manipülatörler olarak kullanabilirim, fakat std::function<ostream&(ostream&)>
'u kullanamam.std :: özel bir akış denetleyicisi olarak işlev
İşte kod aşağı haşlanmış bulunuyor:
g++-4 src/Solve.cpp -c -g -std=c++0x -o src/Solve.o -I/home/ekrohne/minisat
src/Solve.cpp: In function 'int main(int, char**)':
src/Solve.cpp:24:11: error: cannot bind 'std::ostream' lvalue to 'std::basic_ostream<char>&&'
/usr/lib/gcc/i686-pc-cygwin/4.5.3/include/c++/ostream:579:5: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::function<std::basic_ostream<char>&(std::basic_ostream<char>&)>]'
Bu neden başarısız oluyor:
#include <iostream>
#include <functional>
using namespace std;
auto lambdaManip = [] (ostream& stream) -> ostream& {
stream << "Hello world" << endl;
};
function<ostream& (ostream&)> functionManip = [] (ostream& stream) -> ostream& {
stream << "Hello world" << endl;
};
int main (int argc, char** argv) {
cout << lambdaManip; // OK
cout << functionManip; // Compiler error
}
ikinci cout
deyimi aşağıdaki başarısız? Cygwin gcc 4.5.3 kullanıyorum.
Ben soruyorum, verimlilik sorunları nedeniyle, her yerde std::function
kullanarak hakkında deli değilim. Ancak, lambda işlevlerini döndüren işlevler yazmak istiyorum ve std::function
olmadan nasıl yapılacağını bilmiyorum. Örneğin, aşağıdaki gibi bir şey mükemmel olabilir
auto getAdditionFunctor();
auto getAdditionFunctor() {
return [] (int x, int y) { return x + y };
};
... ama açıkçası işe yaramaz. İşe yarayan alternatif bir sözdizimi var mı? Ne olabileceğini hayal edemiyorum, bu yüzden std::function
ile sıkışmış olabilirim.
Eğer ikinci soruya bir çözüm bulsaydım, o zaman ilk soru tartışılırdı.
Teşekkür ederiz.
operator<<(ostream&, std::function<ostream&(ostream&)>
tanımlanıyor. Bir web sayfasını yanlış okumuştum ve ostream
'un bir manipülatör olarak bir operator()
olan keyfi bir nesneyi tedavi edecek kadar akıllı olduğu izleniminin altındaydı. Bu konuda yanılmışım. Dahası, basit lambda
inşa ettiğim gibi, basit bir eski işlev içine derlenmişti. Aslında, lambda
'un basit bir işlev olmadığından emin olmak için değişken yakalama kullanırsam, derleyici başarısız olur. Ayrıca, tanımlanan operator()
ile nesneler değildir (varsayılan) manipülatörler olarak tedavi edilir:
class Manipulator {
ostream& operator()(ostream& stream) const {
return stream << "Hello world" << endl;
};
} classManip;
function<ostream& (ostream&)> functionManip = [] (ostream& stream) -> ostream& {
return stream << "Hello world" << endl;
};
int main (int argc, char** argv) {
const string str = "Hello world";
auto lambdaManip = [&] (ostream& stream) -> ostream& {
return stream << str << endl;
};
cout << classManip; // Compiler error
cout << lambdaManip; // Compiler error
cout << functionManip; // Compiler error
}
fazla güncelleme:
// Tell ostreams to interpret std::function as a
// manipulator, wherever it sees one.
inline ostream& operator<<(
ostream& stream,
const function<ostream& (ostream&)>& manipulator) {
return manipulator(stream);
}
: bu ile gerçekleştirilebilir Aşağıdakiler göre biraz daha güçlü bir çözüm çıkıyor
Bu kodun bir const
vardır. Projemdeki çözümü gerçek anlamda uygulamaya çalışmayı keşfettim. Eğer ostream
için operator<<
bakarsak
Bu manipülatörlerde bir 'geri dönüş' bırakmak mı istediniz? –
Bunların ima edildiğini ve bunları eklemenin yardımcı olmadığını okudum. Bu durumda, geri dönüşlerle daha okunabilir olduklarını düşünüyorum, ancak bunlar yasal değil. Her şeyden önce, her şey çalışır eğer ben cout << functionManip; –
@EdKrohne: 'return' ** burada ** isteğe bağlı değildir - lambda'larınız, herhangi bir işlevde olduğu gibi, bir“ void ”dönüş türü olmayan ve bir değer döndürmeyen UB'yi çağırır. §6.6.3/2: "* Bir fonksiyonun sonunun akması, bir değeri olmayan bir" dönüş "e eşdeğerdir, bu, bir değer döndüren işlevde tanımlanmamış bir davranışla sonuçlanır. *" İyi çalışmanın görünmesi sadece olası bir tezahürdür. UB. – ildjarn