从依赖的非类型模板参数中自动推导出类型模板参数

时间:2017-11-18 02:59:09

标签: c++ templates c++17

我定义了一个类模板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。我想知道是否有一些“黑客”可以在没有此功能的情况下获得相同的效果。

1 个答案:

答案 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