Поскольку вопрос Что-то вроде `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()
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;})
Так что теперь ясно, что вы работаете над элементом вектор, а не сам вектор.
Во-первых, 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;
}
);
Получите V
в качестве параметра для лямбды.
std::find_if(V.begin(), V.end(), [&Name](type& V) {return Name == V->info.name;)
Используйте 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