Использование generi c lambda заголовочного файла в файле реализации - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть этот тип в заголовке MyType.hpp:

struct MyType
{
    template<typename T>
    void operator(T t)
    {
        auto lamdba = [t](auto i){ t.someCall(i); };
        someMethod(lamdba);
    }

    template<typename L>
    void someMethod(L);
};

Итак, someMethod вызывается с помощью лямбды generi c, которая принимает параметр generi c. Можно ли как-то обеспечить реализацию в MyType.cpp для someMethod? Это не работает:

template<typename L>
void MyType::someMethod(L lambda)
{
    lambda(42);
    lambda("42");
    // etc...
}

Поскольку частичная специализация не разрешена (только полная специализация для шаблонов функций), есть ли другой способ «передать» лямбда-файл заголовка в файл реализации MyType.cpp? Если передача невозможна, возможно, существует способ динамического хранения этой лямбды в MyType.hpp и доступа к ней в MyType.cpp?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020
template<typename L>
void MyType::someMethod(L lambda)
{
    lambda(42);
    lambda("42");
    // etc...
}

Не будет работать. Шаблоны (и лямбда) должны быть полностью определены, когда создан . Вы не можете иметь шаблонные определения c в .cpp - в .cpp могут быть реализованы только полные специализации (неформально). Есть несколько способов обойти это. Метод грубой силы заключается в добавлении специализаций для каждого типа (возможно, вызов общего шаблона, который живет только в. cpp). Другим подходом может быть использование какого-то абстрактного фабричного проекта (возвращающего интерфейс, основанный на отправленном типе) - но здесь слишком мало информации, которая является возможным решением.

1 голос
/ 14 февраля 2020

У каждой лямбды свой тип. В любом случае вы не сможете записать тип в исходном коде.

Поскольку единица перевода, которая имеет определение вашего шаблона, никогда не увидит лямбда-тип, шаблон никогда не будет создан. И вы не сможете получить тип лямбды, чтобы сделать его специализацией, или иметь его для ручного создания экземпляра.

Ответ таков: вы не можете использовать лямбда-замыкание в качестве параметра для шаблон специализированный или созданный вручную, если шаблон видим только в своей собственной единице перевода.

...