Я уверен, что вы имели в виду std::find_if
(который принимает предикат), а не std::find
(который принимает значение ).
Также, исправляя ваше условное выражение в конце и добавляя соответствующий шаблон, мы получаем:
#include
#include
#include
#include
struct Car {};
int main()
{
std::vector> cars;
std::shared_ptr lambo = std::make_shared();
std::weak_ptr wPtr(lambo);
cars.emplace_back(lambo);
const auto pos = std::find_if(cars.begin(), cars.end(), [&wPtr](const std::weak_ptr& ptr1) {
return ptr1.lock() == wPtr.lock();
});
if (pos == cars.end())
std::cout << "Not found!" << std::endl;
else
std::cout << "Found!" << std::endl;
}
// Output: Found!
Это довольно легко, пока Вы используете Expression<Action>
вместо Action
. Для полного кода, включая то, как подразумевать фактические значения, посмотрите здесь - в особенности ResolveMethod
(и как это используется Invoke
). Это - код, который я использую в protobuf-сети, чтобы сделать RPC на основе лямбд.
using System;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Linq.Expressions;
class Program
{
static void Create(object o, int n) { Debug.Print("Create!"); }
static void LookAtThis(Expression<Action> expression)
{
//inspect:
MethodInfo method = ((MethodCallExpression)expression.Body).Method;
Debug.Print("Method = '{0}'", method.Name);
//execute:
Action action = expression.Compile();
action();
}
static void Main(string[] args)
{
LookAtThis((Expression<Action>)(() => Create(null, 0)));
}
}
Я думаю, что необходимо было бы использовать Деревья выражений вместо этого. Посмотрите Дерево выражений Образец Visualizer и Как к: Реализуйте Посетителя Дерева выражений.
static MethodInfo GetMethodInfo<T>(Expression<Func<T>> expression)
{
return ((MethodCallExpression)expression.Body).Method;
}
В сущности не это не возможно с отражением. Отражение, прежде всего, нацелено на предоставление информации о контроле метаданных во времени выполнения. То, что Вы просите, является фактической информацией об инспекции кода.
Я полагаю, что возможно получить фактические байты, представляющие IL для метода во времени выполнения. Однако это было бы просто что, массив байтов. Необходимо было бы вручную интерпретировать это в коды операций IL и использование, что для определения то, какие методы назвали. Это почти наверняка не, что Вы ищете все же.
Это возможно, хотя использовать лямбду дерева выражений и проанализировать это для вызовов метода. Однако это не может быть сделано ни на каком произвольном лямбда-выражении. Это должно быть сделано лямбда-выражение дерева выражений.