目前我实现了两个模板函数,每个函数返回一个使用boost :: variant包装的模板函数指针:
功能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>;
}
}
功能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>;
}
}
我的问题是“我们可以将这两个函数合并到一个模板函数中,该函数将A或B的仿函数指针作为模板参数吗?”。我需要这个的原因是因为我可能有两个以上的仿函数,如A和B.
答案 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> class
和F_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_T
和int
等常规类型具有类型A_T<A>
。
除了理论之外,你可以拥有这样的模板模板参数,即使语法起初看起来很糟糕,也是非常直观的。