我有一个模板功能,我想用它的模板参数自动推断。
它运作良好,但现在我需要它的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);
我不认为这是可能的。
但是如果你有一个C ++ 14编译器,你可以使用可变参数lambda做类似的事情。
以身作则
A a{};
auto fakeBondFunc = [&](auto ... as) { func(a, as...); };
fakeBondFunc(B{});
如果你想修复第一个A
参数并强制第二个是B
参数,你也可以在C ++ 11中完成它(不需要可变参数lambda)
A a{};
auto fakeBondFunc = [&](B const & b) { func(a, b); };
fakeBondFunc(B{});
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{});