Как я могу получить указатель на уже выведенную функцию шаблона? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть функция шаблона, и я хочу использовать ее с автоматически выведенными параметрами шаблона.

Она работает хорошо, но теперь мне нужно ее ptr для использования в std::bind.

Это что-то вроде этого:

class A{};
class B{};
class C{};

template<template<typename...> class TContainer, typename TR, typename... TEles>
void func(TContainer<TEles...> container, function<TR(HeadOf<TEles...>::type)> f)
{
    TContainer<TR> rst;
    for(auto it : container)
    {
        fill(rst, f(it));
    }
    return rst;
}

vector<A>      vec_A;  // type : vector<A, allocator<A>>
MyContainer<B> cont_B; // type : MyContainer<B, allovator<B>, Maybe_Sth_Else>  

// auto ptrFoo = func_ptr_of( func(vec_A, transA2B) );
// auto ptrBar = func_ptr_of( func(cont_B, transB2C) );

// auto contB2contC = std::bind(ptrBar, placeholder::_1, transB2C);
// contB2contC(cont_B);

Ответы [ 2 ]

0 голосов
/ 18 мая 2018
    using ptr_t = void(*)(A, B);
    ptr_t ptrFoo = func<A, B>;
    std::function<void(B)> boundFunc = std::bind(ptrFoo, A{}, std::placeholders::_1);
    boundFunc(B{});
0 голосов
/ 18 мая 2018

Не думаю, что это возможно.

Но если у вас есть компилятор C ++ 14, вы можете сделать что-то похожее с вариационной лямбдой.

Например

A  a{};

auto fakeBondFunc = [&](auto ... as) { func(a, as...); };

fakeBondFunc(B{});

Если вы хотите исправить первый параметр A и наложить, что второй является B, вы можете сделать это также в C ++ 11 (без необходимости вариационной лямбды)

A  a{};

auto fakeBondFunc = [&](B const & b) { func(a, b); };

fakeBondFunc(B{});
...