首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板函数返回模板函数指针

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

Stack Overflow用户
提问于 2017-10-05 23:48:21
回答 1查看 827关注 0票数 2

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

  1. 功能法 boost::variant<&A,&A> A_T;A_T fa(string type) { switch(type){ case "int":返回&A;case "double":返回&A;默认值:返回&A;}
  2. 功能fb boost::variant<&B,&B> B_T;B_T fb(string type) { switch(type){ case "int":B &B;case "double":B &B;default: B &B;}

我的问题是“我们能否将这两个函数合并成一个模板函数,其中以A或B的函子指针作为模板参数?”。我之所以需要这个,是因为我可能有两个以上的函子,比如A和B。

EN

回答 1

Stack Overflow用户

发布于 2017-10-06 02:01:33

简单:

代码语言:javascript
复制
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

Atemplate<typename> class,所以它可能是F_Tf的类型参数,它们都是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。可以用作变量类型的普通类型(如intA_T<A> )具有*类型。

撇开理论不说,即使语法一开始看上去不稳定,你也可以有这样的模板参数,这是相当直观的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46596338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档