假設我有一個函數只接受一個類型模板參數,我不能改變它的定義/實現。打開一個類型列表
template < typename T >
void do_it();
現在我有一個類型串定義的常用方式,也無法改變,要麼:
template< typename ...Ts >
struct typelist;
我想實現一個功能接受一個類型串,並在運行do_it()每一種類型:
template< typename List >
void do_them();
我現在發現了,直到」唯一的解決辦法是:
template< typename T >
void do_them_impl()
{
do_it<T>();
}
template< typename T, typename Ts...>
void do_them_impl()
{
do_it<T>();
do_them_impl<Ts...>();
}
template< template < typename...> class List, typename ...Ts >
void do_them_extract(List<Ts...>&&)
{
do_them_impl<Ts>();
}
template< typename List >
void do_them()
{
do_them_impl(List{});
}
但是,這需要4(!)函數爲每個案例我想創建一個do_them
函數。我將需要其中的幾個,我不想爲每個函數編寫四個函數。我錯過了什麼嗎?
C++ 14也歡迎,C++ 17解決方案也是如此,但標記爲這樣。
太快了! C++ 14 - 是否有可能避免std :: initializer_list? (我編碼沒有STL,各種原因)。 C++ 17的版本 - 上帝,我不能等待這在Visual Studio中支持-_- –
@KornelKisielewicz是的,你可以使用一個整數數組或類似的東西:'int _ [] = {0,(do_it(),0)...};'。前0是爲了避免0大小的數組,在C++中無效。 –
skypjack
@skypjack謝謝,這工作! –