auto GetLambda() {
return []( const int &x ) { return x*x ; } ;
}
struct Lambda {
int operator()(const int &x) { return x * x; }
};
Lambda GetLambda() {
return Lambda();
}
auto GetLambda(int y) {
return [y](const int &x) { return x*y; };
}
struct Lambda {
int y;
Lambda(int y) : y(y) { }
int operator()(const int &x) { return x*y; }
};
Lambda GetLambda(int y) {
return Lambda(y);
}
Вот так делать - это нормально?Вполне
И что в таком случае возвращается, указатель на функцию или сама функция?Функциональный объект. Лямбда — не функция, она может быть приведена к указателю на функцию в некоторых случаях.
Если возвращается указатель, то где хранится сама функция, в куче или стеке?«Функция» лямбды хранится там же, где и остальной код. На лету ничего не собирается и не компилируется. Лямбда это синтаксический сахар для объявления класса с перегруженым оператором вызова функции.
И еще один вопрос, по этой же теме:lambda имеет уникальный тип. Это не функция (но может быть приведена к ней в данном случае).
Это сокращенная запись вот такой конструкции:
Или что то другое?
поля объявленные в производном классе исчезают?
Base&
) таких проблем не будет, однако ссылка сама по себе переменной не является (в отличие от указателя) - это лишь дополнительное ИМЯ для некоторой другой переменной или области памяти. Поэтому, вы не сможете сохранить ссылку в векторе - ваш код не скомпилируется. В векторе вам нужно будет хранить указатели. Например, std::vector<Base*>
.#include <iostream>
#include <memory>
#include <vector>
class Base{
public:
// Нужен виртуальный деструктор, ведь мы будем уничтожать детей
// через родительский ук-ль. Да и dynamic_cast требует RTTI,
// а значит, хоть одного виртуального.
virtual ~Base() = default;
};
class Exp: public Base
{
int i=0;
public:
int Get() const { return i; }
void Set(const int &num) { i=num; }
};
std::vector<std::shared_ptr<Base>> MyStack;
Base &GetRef() { return **MyStack.begin(); }
int main() {
std::shared_ptr<Exp> a = std::make_shared<Exp>();
a->Set(4);
MyStack.push_back(a);
int res=dynamic_cast<Exp&>(GetRef()).Get(); // Теперь работает
std::cout << res << std::endl;;
}
#include <iostream>
#include <memory>
class Strategy {
public:
virtual void doAction() = 0;
};
class FirstStrategy : public Strategy{
public:
void doAction() override {
std::cout << "First" << std::endl;
}
};
class SecondStrategy : public Strategy{
public:
void doAction() override {
std::cout << "Second" << std::endl;
}
};
class A {
std::shared_ptr<Strategy> behavior;
public:
void setBehavior(std::shared_ptr<Strategy> b) {
behavior = b;
}
void doBehavior() {
behavior->doAction();
}
};
int main() {
A a;
a.setBehavior(std::make_shared<FirstStrategy>());
a.doBehavior();
a.setBehavior(std::make_shared<SecondStrategy>());
a.doBehavior();
return 0;
}
Example two=std::string("line");
, то все заработает Example two=std::string("line"); -> Example two(std::string("line")); //подходит конструктор Example ( const std::string &line )
Example two="line"; -> Example two("line"); //Нет конструктора, который принимает const char*
Почему при выводе, напримерstd :: cout << cStr ;
Выводится "string" , то есть значение, а не адрес значения как обычно с указателями ?
std::string Get() { /// Приводим this к A* и вызываем Get, удаляя первый символ return ( ( A* ) this ) -> Get () .erase (0, 1); }
struct B : public A
{
/// Переопределяем метод Get
std::string Get()
{
return A::Get () .erase (0, 1);
}
};
struct Example {
int a;
};
void main() {
Example ex;
ex.a = 1;
ex = Example();
ex.a = 2;
}
@_main proc near
push ebp
mov ebp,esp
add esp,-8
mov dword ptr [ebp-4],1
mov eax,dword ptr [ebp-8]
mov dword ptr [ebp-4],eax
mov dword ptr [ebp-4],2
mov esp,ebp
pop ebp
ret
@_main endp
struct Example {
int a;
};
void main(){
Example ex;
ex.a = 1;
for (int i = 0; i < 10; i++) {
ex = Example();
ex.a = i;
}
}
@_main proc near
push ebp
mov ebp,esp
add esp,-12
mov dword ptr [ebp-4],1
xor eax,eax
mov dword ptr [ebp-8],eax
@3: mov edx,dword ptr [ebp-12]
mov dword ptr [ebp-4],edx
mov ecx,dword ptr [ebp-8]
mov dword ptr [ebp-4],ecx
inc dword ptr [ebp-8]
cmp dword ptr [ebp-8],10
jl short @3
mov esp,ebp
pop ebp
ret
@_main endp