2017-11-18 77 views
0

型模板参数我定义的类模板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; 

它对于我在x的声明中重复int类型似乎是多余的。有没有一种方法可以自动演绎出来?我的意思是我想要一个类型模板Y,可以通过Y<&func>使用,等于X<int, &func>,自动推导出int

我尝试了很多,甚至疯狂的定义模板的功能和使用decltype,但似乎没有办法的&func命名之前下降了T

更新:这似乎是我使用MSVC 2017.5防止我从Kerrek的建议在模板参数列表使用auto的限制。我不知道是否有一些“黑客”没有这个功能获得相同的效果。

+1

一个典型的 “黑客” 之前C++ 17使用人涉及一个辅助函数声明,'decltype'和宏。 –

回答

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 
+0

[Demo](https://wandbox.org/permlink/mj7RhnivKbwjQwt2),[使用参考的演示](https://wandbox.org/permlink/9GZNZ5GMWj6yjUQZ) –

+0

这太棒了。但似乎我的编译器(MSVC 2017.5)不支持模板参数列表中的自动。它给C3533。 –

+0

@ M.Winter:你没有在你的问题中指定这个限制。 –