2017-11-18 79 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:你沒有在你的問題中指定這個限制。 –