Tôi đang cố gắng để giải quyết một vấn đề mà các chức năng ẩn danh làm nhiều, dễ dàng hơn nhiều, và đã tự hỏi nếu điều này là có thể trong C++.Có thể có chức năng ẩn danh C++ với tăng không?
Những gì tôi muốn làm là (cơ bản)
template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
return one + dosomething(5);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Ví dụ này là rất, rất đơn giản cho những gì tôi phải làm. Trong C# tôi sẽ làm p => p * 5. Tôi biết điều này rất dễ dàng với C++ 0x, nhưng tôi không thể sử dụng nó. Tôi cảm thấy rằng tôi sẽ có thể làm điều đó với một trong hai boost :: lambda, hoặc một compination của boost :: ràng buộc và tăng :: chức năng với placeholders, nhưng tôi dường như không thể có được nó để làm việc. Điều này có thể không khả thi và điều đó cũng tốt, nhưng hãy trả lời nếu không thể. Cảm ơn.
EDIT: Ok, có vẻ như trường hợp đơn giản của một int hoạt động tốt, còn cấu trúc phức tạp hơn thì sao? Vì vậy, hãy thử
struct NumHolder
{
int x;
}
template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Ở đây biểu thức C# của tôi sẽ nằm dọc theo dòng p => p.temp * 5. Có thể thực hiện điều này trong C++ khi tăng không?
EDIT 2: OK, bây giờ tôi chỉ tò mò: D Làm thế nào tôi sẽ gọi một hàm trong biểu thức lambda? Vì vậy, nếu chúng ta có
int ChangeVal(int mult)
{
return mult*5;
}
struct NumHolder
{
int x;
}
template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}
void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}
Trong C# Tôi có thể gọi p => ChangeVal (p). Cú pháp sẽ là gì đối với điều này với các biểu thức lambda C++?
Có "nhiều, dễ dàng hơn nhiều" để tiết kiệm 5 dòng khai báo functor? – ima
@ima: đây là phiên bản thực sự, đơn giản của những gì tôi cần làm. nếu không thì tôi có hàng tá functors. Trong trường hợp này nó dễ dàng hơn nhiều, tôi chỉ không biết cú pháp – Steve
Nó không phải là cú pháp, đó là các mẫu rối cố gắng triển khai ngữ pháp tùy chỉnh trên đầu trang của C++. Có thể, nhưng tôi cố gắng để tưởng tượng tình huống mà việc tiết kiệm một số dòng mã có giá trị như vậy. Có một lòng từ bi với một số người đàn ông nghèo duy trì mã của bạn một hoặc hai năm sau ... – ima