C ++ лямбда-синтаксис

Поскольку вопрос Что-то вроде `this.class` вместо` ClassName.class`? помечен как дубликат для этого (что можно утверждать, потому что этот вопрос касается класса, а не класса name), я отправляю ответ здесь:

class MyService {
    private static Class thisClass = MyService.class;
    // or:
    //private static Class thisClass = new Object() { }.getClass().getEnclosingClass();
    ...
    static void startService(Context context) {
        Intent i = new Intent(context, thisClass);
        context.startService(i);
    }
}

Важно определить thisClass как private, потому что: 1) он не должен наследоваться: производные классы должны либо определять свои собственные thisClass или создать сообщение об ошибке 2) ссылки из других классов должны выполняться как ClassName.class, а не ClassName.thisClass.

При определенном thisClass доступ к имени класса становится:

thisClass.getName()

9
задан jvb 20 March 2019 в 02:43
поделиться

4 ответа

find_if собирается передать элементы вектора в вашу лямбду. Это означает, что вам нужно

std::find_if(V.begin(), V.end(), [&Name](auto const& V) {return Name == V->info.name;})

, чтобы V в теле лямбда-элемента было элементом вектора, а не самого вектора.


В идеале вы бы дали ему другое имя, чем V, поэтому вы держите вектор и локальные переменные отдельно, как

std::find_if(V.begin(), V.end(), [&Name](auto const& element) {return Name == elememt->info.name;})

Так что теперь ясно, что вы работаете над элементом вектор, а не сам вектор.

0
ответ дан NathanOliver 20 March 2019 в 02:43
поделиться

Во-первых, V->info.name плохо сформирован, внутри или снаружи лямбды.

Объект функции, отправляемый алгоритму std::find_if, должен быть унарной функцией. Он должен взять текущий элемент для проверки в качестве параметра.

auto found = std::find_if(
    V.begin(), V.end(), 
    [&Name](koalaGraph::PVertex const& item_to_check) {
        return Name == item_to_check->info.name;
    }
);

Тип found является итератором найденного элемента. Если ничего не найдено, возвращается V.end()

. Если вы используете C ++ 14 или лучше, вы можете даже использовать общие лямбды:

auto found = std::find_if(
    V.begin(), V.end(), 
    [&Name](auto const& item_to_check) {
        return Name == item_to_check->info.name;
    }
);
0
ответ дан Guillaume Racicot 20 March 2019 в 02:43
поделиться

Получите V в качестве параметра для лямбды.

std::find_if(V.begin(), V.end(), [&Name](type& V) {return Name == V->info.name;)

0
ответ дан Petar Velev 20 March 2019 в 02:43
поделиться

Используйте const auto & для доступа к отдельным элементам вашего вектора в лямбда-выражении. Поскольку вектор является lvalue, auto будет выведен в const vector<PVertex> &. Затем вы можете использовать std::distance, чтобы найти расположение элемента объекта в векторе.

struct PVertex
{
    std::string name;
};

int main()
{
    std::vector<PVertex> V = {{"foo"},{"bar"},{"cat"},{"dog"}};

    std::string Name = "cat";

    auto found = std::find_if(std::begin(V), std::end(V), [&Name](const auto &v){return (Name == v.name);});

    std::cout<< "found at: V["<<std::distance(std::begin(V),found)<<"]" <<std::endl;
}

Результат:

found at: V[2]

Пример: https://rextester.com/IYNA58046

0
ответ дан Constantinos Glynos 20 March 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: