如何使用类的类型作为模板的参数

时间:2015-04-15 23:08:39

标签: c++ templates

我为模糊的标题道歉,但我想创建一个模板类,该类是为指向函数的指针定义的。目前,我有这个:

template<class TB, TB TCons, class TF, TF TDes>
struct foo{}

使用方法如下:

using bar = foo<decltype(&tb), &tb, decltype(&tf), &tf>;

但是,指定&tb&tf的类型以及指针本身的代码冗余非常清楚。有没有办法构建一个模板类,以便我可以做这样的事情呢?

using bar = foo<&tb, &tf>;

4 个答案:

答案 0 :(得分:1)

从C ++ 17开始,我们现在可以使用auto作为模板参数的类型,因此我们现在可以这样做:

template<auto TCons, auto TDes>
struct foo{};

如果我们需要获取TConsTDes的类型,我们可以使用decltype

答案 1 :(得分:0)

这是我最接近的。 (不是完整的解决方案。)

它使用函数参数模板自动扣除,但您仍需要指定参数列表两次。另一种方法是使用自动返回类型推导(C ++ 1y)但是存在的问题是你不能通过参数列表障碍获得参数。

template<class TB, class TF> 
struct foo_h {
  template<TB TCons, TF TDes>
  struct f { 
    typedef foo<TB,TCons,TF,TDes> type;
  };  
};

template<class TB, class TF> 
foo_h<TB,TF> foo_t(TB, TF);

using bar = decltype(foo_t(&tb,&tf))::f<&tb,&tf>::type;

也许它可以帮助有人建立。但我认为还没有解决方案。

这是前面提到的C ++ 1y解决方案,但正如您所看到的那样,它存在传递实际变量的问题:

template<class TB, class TF>
auto foo_t(TB b, TF f) {
  return foo<TB,&tb,TF,&tf>();
  //            ^^^    ^^^ using b and f doesn't work as they don't refer to globals
}

using tofu = decltype(foo_t(&tb,&tf));

答案 2 :(得分:0)

不幸的是,这还不可能。

答案 3 :(得分:0)

预处理器是邪恶的,记住它:

#define FUNC(f) decltype(f), f

using bar = foo<FUNC(&tb), FUNC(&tf)>;