2016-08-16 86 views
3

提取參數的參數列表對於一個單一的功能,可以提取其參數類型是這樣的:元函數從多個功能指針

template <class T> 
struct Foo; 

template <class Ret, class... Args> 
struct Foo<Ret(*)(Args...)> { /* stuff */ }; 

有沒有可能做了一系列函數指針的一樣嗎?也就是說, 能夠提取參數,然後以相同的方式重新部署它們?例如。例如:

template <class.. T> 
struct Foo; 

template <class... Rets, class... Args> 
struct Foo<Rets(*)(Args...)...>   // I wish this worked 
{ 
    std::tuple<Rets(*)(Args...)...> fns; // Ditto 
} 
+0

開始用'模板結構美孚;'然後分發到每個組成員的現有代碼。 –

+0

@KerrekSB對不起,您可否詳細說明一下?我不太清楚你後面的意思。 – silverwidth

+0

您已經有一種方法來處理* one *函數類型。您可以將該設施與不同模板的每個成員一起重複使用。 –

回答

1

晚會晚了,但這可能會有用。首先,讓我們定義一些工具:

template <class... T> 
using void_t = void; 

template <bool...> struct bool_pack; 

template <bool... v> 
using all_true = std::is_same<bool_pack<true, v...>, bool_pack<v..., true>>; 

然後一元函數來檢查類型是否是一個函數指針:

template <class F> 
struct is_function_pointer : std::integral_constant<bool, false> { }; 

template <class Ret, class... Args> 
struct is_function_pointer<Ret (*)(Args...)> : std::integral_constant<bool, true> { }; 

通過這些,讓我們寫的類。因爲一個可變包占據了右側的撥動SFINAE放在第一:

template <class = void_t<>, class... T> 
struct Foo_impl; 

template <class... FuncPtrs> 
struct Foo_impl< 
    std::enable_if_t<all_true<is_function_pointer<FuncPtrs>{}...>{}>, 
    FuncPtrs... 
> { 
    std::tuple<FuncPtrs...> fns; 
}; 

最後一個typedef從用戶隱藏SFINAE切換:

template <class... T> 
using Foo = Foo_impl<void_t<>, T...>; 

瞧! Foo<void (*)(), int (*)(double)>Foo_impl其中包含足夠的元組,Foo<int, double>轉到主要模板。

See it live on Coliru