我定义了一个类模板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 的限制,它阻止我使用 auto
在 Kerrek 建议的模板参数列表中。我想知道是否有一些“hack”可以在没有此功能的情况下获得相同的效果。
最佳答案
当然,使用 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
关于c++ - 从依赖的非类型模板参数自动推导类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47362021/