我定义了一个类模板X
,如下所示:
template <typename T>
using Func = void(T);
template <typename T, Func<T> F>
class X { ... };
现在我可以像这样使用课程X
:
void func(int i);
X<int, &func> x;
在int
的声明中重复x
类型似乎是多余的。有没有办法可以自动推断出来?我的意思是我希望有一个类型模板Y
,可以通过Y<&func>
使用,等于X<int, &func>
自动推断int
。
我尝试了很多,甚至定义了疯狂的模板化函数并使用decltype
,但似乎在命名T
之前无法删除&func
。
更新:似乎是我使用MSVC 2017.5的限制,这阻止我在Kerrek建议的模板参数列表中使用auto
。我想知道是否有一些“黑客”可以在没有此功能的情况下获得相同的效果。
答案 0 :(得分:2)
当然,请使用auto
并部分专注:
template <auto F> struct X;
template <typename T, void (*F)(T)> struct X<F>
{
// ...
};
用法:
void f(int);
X<f> x; // deduces T = int, F = f in the partial specialization