1
在試圖更好地理解可變參數模板時,我自己根據給定的條件(在<type_traits>
中定義的選擇)編寫編譯時類型選擇器的任務,例如std::is_signed
,std::is_floating_point
等)。選擇器應該選擇符合指定爲模板參數的條件的第一個類型。基於條件的編譯時類型選擇的可變參數模板
給你舉個例子:
template<template<typename> class Cond, typename... T>
struct first_if_any {
// some code here
};
first_if_any<std::is_signed, unsigned, long, int>::type a; // long
first_if_any<std::is_unsigned, short, unsigned long, unsigned>::type b; // unsigned long
first_if_any<std::is_floating_point, int, float, double>::type c; // float
這些都是我想我的選擇有特點:
- 選擇第一種類型,如果沒有型式符合條件
- 打印如果沒有指定類型,則會出現用戶友好的編譯錯誤
因此:
first_if_any<std::is_unsigned, long, int>::type a; // long
first_if_any<std::is_arithmetic>::type b; // ERROR
這就是我想出了(參見工作示例here):
template<template<typename> class Cond, typename... T>
struct first_if_any {
using type = void;
static constexpr bool found = false;
};
template<template<typename> class Cond, typename First, typename... T>
struct first_if_any<Cond, First, T...> {
using type = typename std::conditional<Cond<First>::value || !first_if_any<Cond, T...>::found, First, typename first_if_any<Cond, T...>::type>::type;
static constexpr bool found = Cond<First>::value || first_if_any<Cond, T...>::found;
};
這將選擇類型如預期,並符合要求1.現在對於我的問題:
- 我怎樣才能滿足要求2,即如果有人試圖使用選擇器而不將類型傳遞給它,會產生用戶友好的編譯錯誤?
- 有沒有更好的方法來做到這一點(只使用標準庫功能)?
獎金的問題,如果有人關心闡述:
- 這是否有資格作爲模板元編程?
隨着'模板<模板類電導率,typename的T,類型名稱... TS>結構first_if_any;',編譯器將在產生錯誤缺少模板參數的使用點,因爲您至少需要一個模板參數,所以請根據專業化來替換您的基類。 –
Jarod42
@ Jarod42:是[this](http://coliru.stacked-crooked.com/a/8b7289da1e271521)你的意思是?編譯器抱怨:「類模板部分特化不專用任何模板參數」。 – themiurge
不完全如[that](http://coliru.stacked-crooked.com/a/9afc91cc46d50934)。我也必須改變定義BTW(和[與錯誤消息](http://coliru.stacked-crooked.com/a/47a9781222468d37)) – Jarod42