2013-09-26 67 views
5

Có thể sử dụng biểu thức lambda làm thuộc tính lớp không? Tôi đang làm việc trên một trò chơi nhỏ trong C++, nơi tất cả các bot đều có thói quen cập nhật giống nhau, nhưng mọi người nên có thói quen cập nhật thêm tùy chọn của riêng mình.Biểu thức Lambda dưới dạng thuộc tính lớp?

Tôi nghĩ một cái gì đó như thế

class Bot 
{ 
private: 
    Lambdatype lambda; 

public: 
    Bot(Lambda l) {lambda = l;} 
    update() { dosomething(); lambda(); } 
}; 
+0

BTW, nó đánh vần là "lambda" :) – StilesCrisis

+0

Mỗi biểu thức lambda có một loại độc đáo, vì vậy tôi không nghĩ rằng nó có thể. Xem xét 'auto x = [] {}; auto y = [] {}; std :: is_same {} // lợi nhuận sai'. – dyp

+0

@StilesCrisis Ah, cảm ơn bạn :) trong những ngày đầu tôi nghĩ rằng nó sẽ được đánh vần lambada – user2796729

Trả lời

7

Bạn có thể sử dụng std::function, ví dụ giả định đó là void chức năng và được hai int:

class Bot 
{ 
private: 
    using Lambda = std::function<void(int, int) >; 
    Lambda lambda; 

public: 

    Bot(const Lambda &l) : lambda(l) 
    { 
    } 

    void update() 
    { 
     //dosomething...; 
     lambda(1, 2); 
    } 
}; 

int main() 
{ 
    Bot bot ([](int x, int y){ cout << x+y << endl; }); 

    bot.update(); 
} 

More generic:

template <typename L> 
class Bot 
{ 
private: 
    L lambda; 

public: 

    Bot(const L &l) : lambda(l) 
    { 
    } 

    void update() 
    { 
     //dosomething...; 
     lambda(1, 2); 
    } 
}; 

int main() 
{ 
    Bot<std::function<void(int,int)>> bot (
         [](int x, int y){ cout << x+y << endl; } 
    ); 
    bot.update(); 
} 

Template dựa trên:

template <typename L> 
struct Bot 
{ 
private: 
    L lambda; 

public: 
    Bot(const L &l) : lambda{l} {} 
    void update() { lambda(1,2); } 
}; 

int main() 
{ 
    auto l = [](int x, int y){ std::cout << x + y << std::endl; }; 

    Bot<decltype(l)> bot(l); 

    bot.update(); 
} 
+0

Cool nó chạy, cảm ơn bạn !! – user2796729

+1

Lợi ích bổ sung: bạn không bị giới hạn trong lambda bây giờ, bạn có thể lưu trữ bất cứ thứ gì có chữ ký chính xác. – MSalters

1

addional bạn có thể sử dụng make_bot

template< class L > 
struct bot 
{ 
    bot(L l) : lambda{l} {} 
    void update() { lambda(1,2); } 
private: 
    L lambda; 
}; 

template< class L > bot<L> make_bot(L l) { return {l}; } 

int main() 
{ 
    auto my_bot = make_bot([](int x, int y){ std::cout << x + y << std::endl;}) ; 

    my_bot.update(); 
} 
+0

Vấn đề với kỹ thuật này là mỗi bot có kiểu lambda riêng của nó, và do đó nó là kiểu 'bot ' của riêng nó. Điều đó có nghĩa là bạn không thể có một bộ sưu tập các bot nữa. – MSalters

+0

@MSalters. std :: tuple đến để được giúp đỡ :) –

Các vấn đề liên quan