模板函数返回模板函数指针

时间:2017-10-05 23:48:22

标签: c++ templates boost overloading metaprogramming

目前我实现了两个模板函数,每个函数返回一个使用boost :: variant包装的模板函数指针:

  1. 功能fa

    typedef boost::variant<&A<int>,&A<double>> A_T;
    
    A_T fa(string type)
    {
        switch(type){
            case "int":  return &A<int>;
            case "double": return &A<double>;
            default: return &A<int>;
        }
    }
    
  2. 功能fb

    typedef boost::variant<&B<int>,&B<double>> B_T;
    
    B_T fb(string type)
    {
       switch(type){
           case "int":  return &B<int>;
           case "double": return &B<double>;
           default: return &B<int>;
       }
    }
    
  3. 我的问题是“我们可以将这两个函数合并到一个模板函数中,该函数将A或B的仿函数指针作为模板参数吗?”。我需要这个的原因是因为我可能有两个以上的仿函数,如A和B.

1 个答案:

答案 0 :(得分:1)

简单:

srp = ActiveDocument.SelectContentControlsByTag("RPI").Item(1).Range.Text  ' Read
ActiveDocument.SelectContentControlsByTag("SRP").Item(1).Range.Text = srp  ' Write

template<template<typename> class F> // template template using F_T = boost::variant<F<int>&, F<double>&>; // Need C++11 for this (not strictly needed) alias template<template<typename> class F> F_T<F> f(std::string type) { if(type == "double") return something<F<double>&>(); else return something<F<int>&>(); } using A_T = F_T<A>; A_T at = f<A>("int"); // F_T<int> broken; // invalid: int is not a template<typename> class // f<int>("int") // invalid: int is not a template<typename> class A,因此它可能是template<typename> classF_T的类型参数,它们都是f。比较函数template<template<typename> class>并将其作为参数传递给函数a => b。我们说函数(a => b) => c类型 [](int i) { return i + 5; },就像类型int => int kind template<typename> class A一样类型到具体类型)。就像高阶函数可以具有类似* -> *的类型一样,更高级的类型可以具有类似(A => A) => A的类型,例如(* -> *) -> *。可以用作变量类型的F_Tint等常规类型具有类型A_T<A>

除了理论之外,你可以拥有这样的模板模板参数,即使语法起初看起来很糟糕,也是非常直观的。