目前,我实现了两个模板函数,每个函数返回一个使用boost::variant包装的模板函数指针:
我的问题是“我们能否将这两个函数合并成一个模板函数,其中以A或B的函子指针作为模板参数?”。我之所以需要这个,是因为我可能有两个以上的函子,比如A和B。
发布于 2017-10-06 02:01:33
简单:
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> classA是template<typename> class,所以它可能是F_T和f的类型参数,它们都是template<template<typename> class>。比较是否有一个函数a => b,并将其作为参数传递给函数(a => b) => c。我们说函数[](int i) { return i + 5; }有int => int类型,就像类型template<typename> class A有类* -> * (具体类型到具体类型)一样。就像高阶函数可以有像(A => A) => A那样的类型,高级类型的类型可以有(* -> *) -> *,例如F_T。可以用作变量类型的普通类型(如int和A_T<A> )具有*类型。
撇开理论不说,即使语法一开始看上去不稳定,你也可以有这样的模板参数,这是相当直观的。
https://stackoverflow.com/questions/46596338
复制相似问题