我怎么能得到一个已经推断出的模板函数的指针?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎么能得到一个已经推断出的模板函数的指针?相关的知识,希望对你有一定的参考价值。

我有一个模板功能,我想用它的模板参数自动推断。 它运作良好,但现在我需要它的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{});

以上是关于我怎么能得到一个已经推断出的模板函数的指针?的主要内容,如果未能解决你的问题,请参考以下文章

推断指针非类型模板参数的类型

C++ Primer 5th笔记(chap 16 模板和泛型编程)函数指针和实参推断

QT调试时怎么查看某个指针指向的一片内存区域的信息

虚函数探秘

求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?

lambda 是不是应该衰减为模板代码中的函数指针?