我为模糊的标题道歉,但我想创建一个模板类,该类是为指向函数的指针定义的。目前,我有这个:
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>;
答案 0 :(得分:1)
从C ++ 17开始,我们现在可以使用auto
作为模板参数的类型,因此我们现在可以这样做:
template<auto TCons, auto TDes>
struct foo{};
如果我们需要获取TCons
和TDes
的类型,我们可以使用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)>;