代码之家  ›  专栏  ›  技术社区  ›  lubgr

将显式指定的函数模板重载作为模板参数传递的正确语法是什么?

  •  3
  • lubgr  · 技术社区  · 6 年前

    考虑以下两个函数模板

    template<class T> void g(std::vector<T>&) {}
    template<class T> void g(std::list<T>&) {}
    

    以及中间函数

    template<class Fct, class Container> void h(Fct&& f, Container& c)
    {
       f(c);
    }
    

    我该怎么称呼 h 以显式实例化 g (就像 this answer )是吗?我试过这些

    std::vector<int> vec;
    
    h(g<void(std::vector<int>&)>, vec); // Error, can't deduce template paramter Fct
    h(g<void<int>(std::vector<int>&)>, vec); // Same problem
    

    但现在我缺乏尝试其他语法的想象力(我知道我可以用lambda或函数对象包装调用,但这不是我想在这里做的)。谢谢你的建议!

    1 回复  |  直到 6 年前
        1
  •  1
  •   lubgr    6 年前

    好吧,我自己想出来了:

    h<void(std::vector<int>&)>(g, vec);
    

    它混淆了要显式实例化的函数模板,并错误地选择了 g 而不是 h 是的。